初始化具有显式大小的char数组并初始化为大于该大小

时间:2014-04-18 07:21:43

标签: c string initialization c-strings

我一直在阅读一些代码,但我遇到了以下内容:

int function(){
    char str[4] = "ABC\0";
    int number;

    /* .... */
}

通常,当你编写一个字符串文字来初始化一个char数组时,该字符串应该是null隐式终止对吗?在这种情况下会发生什么?编译器是否识别' \ 0'在字符串文字中并使其成为空终止符?还是溢出到int数?这个表格有什么问题吗?

2 个答案:

答案 0 :(得分:6)

如果代码是:

char str[3] = "ABC";

在C中没问题,但字符数组str不是字符串,因为它不是以空值终止的。有关详细信息,请参阅C FAQ: Is char a[3] = "abc"; legal? What does it mean?

在你的例子中:

char str[4] = "ABC\0";

数组str的最后一个字符恰好设置为'\0',所以它很好并且它是一个字符串。

答案 1 :(得分:6)

C99标准§6.7.8.¶14说

  

字符类型数组可以由字符串初始化   文字,可选择括在括号中。连续的人物   字符串文字(包括终止空字符if)   有空间或者如果数组的大小未知)初始化   数组的元素。

这意味着以下陈述是等效的。

char str[4] = "ABC\0";
// equivalent to
char str[4] = "ABC";
// equivalent to
char sr[4] = {'A', 'B', 'C', '\0'};

所以上面的第一个陈述没有错。正如标准明确指出的那样,只有字符串文字中的那么多字符用于初始化数组作为数组的大小。请注意,字符串文字"ABC\0"实际上包含五个字符。 '\0'就像任何角色一样,所以没关系。

但请注意,

之间存在差异
char str[4] = "ABC\0";
// equivalent to 
char str[4] = {'A', 'B', 'C', '\0'};


char str[] = "ABC\0";  // sizeof(str) is 5 
// equivalent to
char str[] = {'A', 'B', 'C', '\0', '\0'};

这是因为字符串文字"ABC\0"包含5个字符,当未指定数组str的大小时,所有这些字符都用于str的初始化。与此相反,当str的大小明确声明为4时,只有文字4中的第一个"ABC\0"字符用于初始化,如上所述以上引用的标准段落。