对于以下代码:
char a[] = "Apple";
char *s[] = {"Apple"};
printf("%d %d\n", sizeof(a), sizeof(s[0]));
输出是:
6 4
有人能告诉我为什么sizeof()
提供不同的输出?
编辑:我本来打算打字输入sizeof()
,但输入的是strlen()
。我为此道歉。我现在已经编辑了这个声明。
sizeof(a)
是数组的大小,包含终结符以及5个可打印字符。
strlen(s[0])
给出字符串的长度,不包括终结符,因为这是strlen
指定要做的。
更新:sizeof(s[0])
是指针的大小。只给出指向它的指针,就无法确定数组的大小。
sizeof
为您提供分配给char
的a
s的数量,而strlen
为您提供a
中可用字符串的长度。
\0
计算为字符串内存大小的一部分,但strlen()
给出的字符串本身的长度仅由遇到\0
之前的字符给出。
声明如下的字符数组:
char a[] = "Apple";
根据语言规范,它具有空终止符。因此,数组的长度为6.有5个字符,然后是null终止符。
另一方面,strlen()
返回空终止符之前的字符数。这是5。
sizeof
运算符产生其操作数的大小(以字节为单位)。
在这个声明中
char a[] = "Apple";
数组a由包含终止零的字符串文字“Apple”的字符初始化。实际上这个记录相当于
char a[] = { 'A', 'p', 'p', 'l', 'e', '\0'; };
所以a的字节大小等于6。
标准C函数strlen
对字符串中的符号进行计数,直到遇到终止零。所以
strlen(一)
将返回5,即数组中终止零之前的字符数。
考虑到你可以写一些例子
char a[100] = "Apple";
在这种情况下,sizeof( a )
将产生100,因为您明确指定了数组将占用的字节数。但是它只用字符串文字的6个字符初始化。那么如何找到字符数组中有多少实际数据呢?为此,引入了函数strlen
,以区分字符数组的大小和字符数组中的实际数据的数量。
因为在C中没有字符串类型。 String是一个以NULL结尾的字符数组。 strlen()计算字符直到NULL字符,而sizeof()实际返回charater数组使用的内存量。
a
是一个char
s数组,包含6个元素,因此sizeof
返回6(字符串的长度包括零终止)。
qazxsw poi是qazxsw poi的一系列指针。指针大小为4个字节。 s
返回第一个元素的大小,即指针,即大小为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是预期值。