5

下面是一段 C99 代码:

int main(void)
{
    char c[] = "\0";
    printf("%d %d\n", sizeof(c), strlen(c));

    return 0;
}

程序正在输出2 0。我不明白为什么sizeof(c)意味着2看到我定义c为立即NULL终止的字符串文字。有人可以解释为什么会这样吗?您能否提供(一些)资源,我可以在自己的时间进一步调查这种现象。

4

6 回答 6

18

不明白为什么 size of 显示为 2。

字符串文字有一个隐式终止空字符,所以ch[]实际上是\0\0,所以大小是 2。从C99 标准(草案 n1124)的第6.4.5 节字符串文字第 5 节:

在翻译阶段 7 中,将一个字节或零值代码附加到每个由一个或多个字符串文字产生的多字节字符序列

至于strlen(),当它遇到第一个空终止字符时它会停止计数。sizeof返回的值与包含该字符串的数组无关。在 的情况下ch[],将返回零,因为数组中的第一个字符是空终止符。

于 2013-08-14T07:30:35.087 回答
3

在 C 语言中,""意味着:给我一个字符串并为我终止它

例如arr[] = "A"完全等价于arr[] = {'A', '\0'};

因此"\0"意味着:给我一个包含空终止符的字符串,然后为我终止它。

arr [] = "\0""等价于 arr[] = {'\0', '\0'};

于 2013-08-14T08:25:00.313 回答
2

"\0"不一样""。字符串文字以 nul 结尾,因此第一个与复合文字相同,(char){ 0, 0 }而第二个只是(char){ 0 }. strlen发现第一个字符为零,因此假定字符串结束。这并不意味着数据结束。

于 2013-08-14T07:31:58.190 回答
2

当您将字符串文字声明为:

char c[]="\0";

'\0'它的末尾已经有一个字符,所以sizeof(c)给出了2因为你的字符串文字实际上是 : \0\0

strlen(c)仍然给出,0因为它停在第一个\0

于 2013-08-14T07:32:12.960 回答
1

strlen测量第一个 \0 并给出 \0 之前的字符数,因此答案为零

sizeof在 char x[] 上给出了以字节为单位的存储量,它是两个,包括字符串末尾的显式 \0

于 2013-08-14T07:36:23.203 回答
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。

于 2013-08-14T07:39:43.833 回答