我在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'结尾
答案 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,但是在这里,我们没有让数组有这种行为的机会,因此编译器的行为是随机的。