以下是C99代码的片段:
int main(void)
{
char c[] = "\0";
printf("%d %d\n", sizeof(c), strlen(c));
return 0;
}
该程序正在输出2 0
。我不明白为什么sizeof(c)
暗示2
看到c
,因为我将NULL
定义为立即{{1}}终止的字符串文字。有人可以解释为什么会这样吗?你能否提供(某些)资源,我可以在我自己的时间进一步研究这种现象。
答案 0 :(得分:18)
不明白为什么尺寸显示为2。
字符串文字具有隐式终止空字符,因此ch[]
实际上是\0\0
,因此大小为2。来自C99标准(草案n1124)的 6.4.5字符串文字部分,第5条:
在转换阶段7中,将值为零的字节或代码附加到每个多字节 由字符串文字或文字
产生的字符序列
对于strlen()
,它在遇到第一个空终止字符时停止计数。返回的值与包含该字符串的数组的sizeof
无关。在ch[]
的情况下,将返回零,因为数组中的第一个字符是空终止符。
答案 1 :(得分:3)
在C中,""
表示:给我一个字符串,null为我终止。
例如arr[] = "A"
完全等同于arr[] = {'A', '\0'};
因此"\0"
表示:给我一个包含空终止的字符串,然后为我终止它。
arr [] = "\0"
“相当于arr[] = {'\0', '\0'};
答案 2 :(得分:2)
"\0"
与""
不同。字符串文字以nul结尾,因此第一个与复合文字(char){ 0, 0 }
相同,而第二个只是(char){ 0 }
。 strlen
发现第一个字符为零,因此假设字符串结束。这并不意味着数据结束。
答案 3 :(得分:2)
将字符串文字声明为:
char c[]="\0";
结尾处已有'\0'
个字符,因此sizeof(c)
提供了2
,因为您的字符串文字实际上是:\0\0
。
strlen(c)
仍然提供0
,因为它会在第一个\0
停止。
答案 4 :(得分:1)
strlen
测量到第一个\ 0并给出\ 0之前的字符数,所以答案为零
sizeof
给出了以字节为单位的存储量,即2,包括字符串末尾的explict \ 0
答案 5 :(得分:0)
好问题。考虑一下......
ubuntu@amrith:/tmp$ more x.c
#include <stdio.h>
#include <string.h>
int main() {
char c[16];
printf("%d %d\n",sizeof(c),strlen(c));
return 0;
}
ubuntu@amrith:/tmp$ ./x
16 0
ubuntu@amrith:/tmp$
还要考虑这个:
ubuntu@amrith:/tmp$ more x.c
#include <stdio.h>
#include <string.h>
int main() {
int c[16];
printf("%d\n",sizeof(c));
return 0;
}
ubuntu@amrith:/tmp$ ./x
64
ubuntu@amrith:/tmp$
当您将变量初始化为数组(实际上是c []时),sizeof(c)将为您提供数组的已分配大小。
字符串“\ 0”是文字字符串\ NUL \ NUL,它占用两个字节。
另一方面,strlen()计算字符串长度,它是第一个终止字符的字符串的偏移量,结果为零,因此得到2,0。