#include<stdio.h>
int main()
{
char a[4] = {'7','4','5'};
for(int i=0; a[i] != '\0'; i++)
printf("%c\n", a[i]);
}
由于编译器自动为null终止数组,所提到的代码按预期工作。
但是当我将第4行更改为char a[] = {'7', '4', '5'};
时,代码仍可正常工作,但会在字符串末尾打印出一些额外的字符。
我的问题是为什么编译器在第二种情况下不使用null终止数组。
答案 0 :(得分:4)
编译器不会自动空终止数组。它所做的就是填充你没有用零显式初始化的部分。在你的情况下,它只是一个未初始化的元素,但它可能是任意数量的元素:
char a[14] = {'7', '4', '5'}; // Compiler provides 11 zeros
如果为N个元素的数组指定N个初始值设定项,则或根本没有元素:
char a[3] = {'7', '4', '5'}; // Compiler provides no zeros
当你让编译器从初始化器中推断出数组的大小时,没有任何元素可以进行零初始化,因为该数组只有三个元素 - '7'
,'4'
和{ {1}}。 '5'
没有空间,因为当编译器不提供任何额外的零时,它等同于上面的情况。
这就是为什么如果你想要空终止,你需要自己做,比如
'\0'
或让编译器通过使用字符串文字进行初始化来为您执行此操作,如下所示:
char a[] = {'7', '4', '5', '\0'};
注意:只有当数组中有足够的空间用于终结符时,编译器才会为使用字符串文字初始化的char a[] = "745";
数组提供空终止符。例如,char
不会被终止,因为char a[3] = "745"
没有空格。
答案 1 :(得分:0)
您将第一个数组声明为char
的4元素数组,并且只显式初始化前三个元素。结果,编译器隐式地将第四个元素初始化为0(编译器不将数组视为字符串;但这只是一个规则,如果没有那么多的初始化器是数组中的元素,其余元素初始化为0或NULL,具体取决于数组的类型)。
您将第二个数组声明为char
的3元素数组,并显式初始化所有元素(数组大小取自初始化程序的数量)。空终止符没有空间,编译器不会扩展数组以插入一个。