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

Ton*_*hen 0 c arrays termination char string-literals

我在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;
}
Run Code Online (Sandbox Code Playgroud)

但输出显示只有数组b以终结符结束'\0'.这是为什么?我想所有的char数组都必须结束'\0'.

输出:

b以'\ 0'结尾

Sou*_*osh 6

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

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

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

强调C11§6.7.9中的引用,

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

所以,你需要

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