一些char数组不以'\ 0'结尾

时间:2017-07-17 07:47:23

标签: c arrays char string-literals termination

我在C中有一个简单的代码,看看三个相同的char数组是否都以'\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'结束。这是为什么?我想所有的char数组都必须以'\0'结束。

输出:

  

b以'\ 0'结尾

4 个答案:

答案 0 :(得分:6)

主要问题是,对于定义为char a[4] = ....(大小为4个元素)的数组,使用if (a[4] ....)已经是一个一个并导致undefined behavior

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

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

强调C11,§6.7.9,

的引用
  

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

所以,你需要

  • 使用具有空终结符空间的数组大小
  • 或者,使用未知大小的数组,如char a[ ] = "1234";,其中,数组大小由提供的初始化程序的长度(包括空终止符)自动确定。

答案 1 :(得分:4)

未定义的行为,因为您尝试访问数组越界。

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

C标准(c11 - 6.7.9:第14段)说:

  

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

因此,不指定数组初始化中字符数组的界限。

char a[] = "1234";

答案 2 :(得分:3)

您需要在数组末尾再添加一个位置来存储\0。声明长度为5的数组。

如果数组中包含n元素,则可以访问数组的n元素。这里数组的大小是4个字节,当你执行像{{1}这样的操作时,你试图得到5字节(因为C中的数组索引从0开始) }。

答案 3 :(得分:0)

在不指定数组大小的情况下执行上述代码,在这种情况下,将执行所有3条if语句,这是因为我们已经指定了数组大小,并且我们知道字符串数组对于NULL TERMINATION将再占用1个char,但是在这里,我们没有让数组有这种行为的机会,因此编译器的行为是随机的。