在C中显式初始化数组期间的歧义

时间:2015-11-10 17:16:49

标签: c arrays

#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终止数组。

2 个答案:

答案 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元素数组,并显式初始化所有元素(数组大小取自初始化程序的数量)。空终止符没有空间,编译器不会扩展数组以插入一个。