我一直在阅读一些代码,但我遇到了以下内容:
int function(){
char str[4] = "ABC\0";
int number;
/* .... */
}
通常,当你编写一个字符串文字来初始化一个char数组时,该字符串应该是null隐式终止对吗?在这种情况下会发生什么?编译器是否识别' \ 0'在字符串文字中并使其成为空终止符?还是溢出到int数?这个表格有什么问题吗?
答案 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"
字符用于初始化,如上所述以上引用的标准段落。