[英]Behaviour of sizeof() operator
对于以下代码:
char a[] = "Apple";
char *s[] = {"Apple"};
printf("%d %d\n", sizeof(a), sizeof(s[0]));
输出为:
6 4
谁能告诉我为什么sizeof()
提供不同的输出?
编辑:我原本打算键入sizeof()
,但改为键入strlen()
。 我对此表示歉意。 我已经编辑了该声明。
sizeof
给你的数字char
小号分配到a
,而strlen
为您提供了可用的字符串的长度在a
。
sizeof(a)
是数组的大小,其中包含终止符以及5个可打印字符。
strlen(s[0])
给出字符串的长度,不包括终止符,因为这是strlen
被指定要做的事情。
更新: sizeof(s[0])
是指针的大小。 仅通过指向数组的指针就无法确定数组的大小。
\\0
算作字符串内存大小的一部分,但是字符串本身的长度strlen()
由strlen()
给出strlen()
仅由遇到\\0
之前的字符给出。
声明如下的字符数组:
char a[] = "Apple";
根据语言规范,它具有一个空终止符。 因此,数组的长度为6。有5个字符,然后是空终止符。
另一方面, strlen()
返回空终止符之前的字符数。 是5
sizeof
运算符产生其操作数的大小(以字节为单位)。
在此声明中
char a[] = "Apple";
数组a由字符串文字“ Apple”的字符初始化,该字符包括结尾的零。 实际上,这个记录相当于
char a[] = { 'A', 'p', 'p', 'l', 'e', '\0'; };
因此,a的字节大小等于6。
标准的C函数strlen
对字符串中的符号进行计数,直到遇到终止的零为止。 所以
strlen(a)
将返回5,即数组中终止于零之前的字符数。
考虑到您可以编写例如
char a[100] = "Apple";
在这种情况下, sizeof( a )
将产生100,因为您明确指定了数组将占用的字节数。 但是,它仅用字符串文字的6个字符初始化。 那么如何查找字符数组中有多少实际数据呢? 为此,引入了strlen
函数,以区分字符数组的大小和字符数组中实际数据的数量。
因为在C中没有字符串类型。 字符串是一个以NULL终止的字符数组。 strlen()对字符进行计数,直到NULL字符为止,而sizeof()实际上返回charater数组使用的内存量。
a
是char
数组,其中包含6个元素,因此sizeof
返回6(字符串的长度,包括零终止)。
s
是一个指向char
的指针数组。 指针大小为4个字节。 sizeof(s[0])
返回第一个元素的大小,即指针,即其大小为4。
定义时:
char a [] =“ Apple”;
它表示一个字符数组,它等于以下定义:
char a [] = {'A','p','p','l','e','\\ 0'}; //'\\ 0'是等于0的字符串终止符
由于char类型的大小为1,因此sizeof(a)返回6,即整个数组的大小。
不过,在定义时:
char * s [] = {“ Apple”};
它表示一个char指针数组。 因此,sizeof(s [0])返回其第一个元素的大小,该大小等于sizeof(char *)。 对于32位平台,sizeof(char *)=4。如果在64位平台上执行,则期望值为8。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.