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