一些字符数组不与“\ 0”

问题描述:

我在C的简单代码结束看如果三个相同字符数组所有端与'\0'一些字符数组不与“ 0”

int main(){ 
    char a[4] = "1234"; 
    char b[4] = "1234"; 
    char c[4] = "1234"; 


    if(a[4] == '\0') 
      printf("a end with '\\0'\n"); 
    if(b[4] == '\0') 
      printf("b end with '\\0'\n"); 
    if(c[4] == '\0') 
      printf("c end with '\\0'\n"); 

    return 0; 
} 

但输出显示,只有数组b端终止者'\0'。这是为什么?我认为所有的字符阵列都必须以'\0'结束。

输出:

B端侧与 '\ 0'

+4

你用4个字节的空格声明了数组,但你试图读取字节5. – Ryan

+1

购买一本好的初学者书。当你完成所有练习时,你可以开始在编译器中查找错误:D –

+1

“我认为所有的char阵列都必须以'\ 0'结尾。” - 不。所有_strings_必须以'\ 0'终止符结束,但没有空终止符的字符数组是完全可以接受的。 –

的主要问题是,对于像char a[4] = ....定义(大小4种元素)的阵列,使用if (a[4] ....)已经关闭并且导致undefined behavior

您想检查a[3],因为这是最后的有效的元素。

这就是说,在你的情况下,你没有空间终结者!

C11,§6.7.9强调报价,

字符类型的数组,可以用字符串文字或UTF-8字符串文字进行初始化,任选在大括号。字符串文字的连续字节(包括终止空字符(如果有空间或数组未知大小)初始化数组的元素。

所以,你需要或者

  • 使用具有空间空终止
  • ,或者使用未知大小的数组,像char a[ ] = "1234";其中,数组大小的数组的大小由所提供的初始值设定的长度自动地确定(包括空终止符。)
+1

很高兴看到downvote,请也添加评论,我坚持。 –

+1

我不明白,你的答案绝对正确! –

+0

谢谢!我认为这是答案。 –

它是未定义的行为因为你必须试图访问数组越界。

不要指定用字符串文字初始化的字符串的边界,因为编译器会自动为整个字符串文字分配足够的空间,包括终止空字符。

C标准(C11 - 6.7.9:第14段)表示:

字符类型的数组,可以用一个字符串被初始化 字面或UTF-8字符串文字,任选包封在括号。 字符串文字的连续字节(包括终止空字符 ,如果有空间或者数组未知大小) 初始化数组的元素。

所以,在数组initialize中没有指定字符数组的边界。

char a[] = "1234"; 

您需要在数组末尾再加一个地方来存储\0。声明长度为5的阵列。

如果数组有n元素,则可以访问数组的第n个元素。这里的数组的大小是4字节,并且当您执行类似if(a[4] == '\0')的操作时,您试图获得第5个字节(因为C中的数组索引从0开始)。