sizeof()显示不同的输出

时间:2013-08-14 07:28:01

标签: c sizeof string-literals

以下是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}}终止的字符串文字。有人可以解释为什么会这样吗?你能否提供(某些)资源,我可以在我自己的时间进一步研究这种现象。

6 个答案:

答案 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之前的字符数,所以答案为零

char x []上的

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。