下面是一段 C99 代码:
int main(void)
{
char c[] = "\0";
printf("%d %d\n", sizeof(c), strlen(c));
return 0;
}
程序正在输出2 0
。我不明白为什么sizeof(c)
意味着2
看到我定义c
为立即NULL
终止的字符串文字。有人可以解释为什么会这样吗?您能否提供(一些)资源,我可以在自己的时间进一步调查这种现象。
下面是一段 C99 代码:
int main(void)
{
char c[] = "\0";
printf("%d %d\n", sizeof(c), strlen(c));
return 0;
}
程序正在输出2 0
。我不明白为什么sizeof(c)
意味着2
看到我定义c
为立即NULL
终止的字符串文字。有人可以解释为什么会这样吗?您能否提供(一些)资源,我可以在自己的时间进一步调查这种现象。
不明白为什么 size of 显示为 2。
字符串文字有一个隐式终止空字符,所以ch[]
实际上是\0\0
,所以大小是 2。从C99 标准(草案 n1124)的第6.4.5 节字符串文字第 5 节:
在翻译阶段 7 中,将一个字节或零值代码附加到每个由一个或多个字符串文字产生的多字节字符序列
至于strlen()
,当它遇到第一个空终止字符时它会停止计数。sizeof
返回的值与包含该字符串的数组无关。在 的情况下ch[]
,将返回零,因为数组中的第一个字符是空终止符。
在 C 语言中,""
意味着:给我一个字符串并为我终止它。
例如arr[] = "A"
完全等价于arr[] = {'A', '\0'};
因此"\0"
意味着:给我一个包含空终止符的字符串,然后为我终止它。
arr [] = "\0"
"等价于 arr[] = {'\0', '\0'};
"\0"
不一样""
。字符串文字以 nul 结尾,因此第一个与复合文字相同,(char){ 0, 0 }
而第二个只是(char){ 0 }
. strlen
发现第一个字符为零,因此假定字符串结束。这并不意味着数据结束。
当您将字符串文字声明为:
char c[]="\0";
'\0'
它的末尾已经有一个字符,所以sizeof(c)
给出了2
因为你的字符串文字实际上是 : \0\0
。
strlen(c)
仍然给出,0
因为它停在第一个\0
。
strlen
测量第一个 \0 并给出 \0 之前的字符数,因此答案为零
sizeof
在 char x[] 上给出了以字节为单位的存储量,它是两个,包括字符串末尾的显式 \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。