[英]Initializing a char array with an explicit size and initialized to bigger than the size
我一直在阅读一些代码,我遇到了以下内容:
int function(){
char str[4] = "ABC\0";
int number;
/* .... */
}
通常,当你编写一个字符串文字来初始化一个char数组时,该字符串应该是null隐式终止对吗? 在这种情况下会发生什么? 编译器是否识别字符串文字中的'\\ 0'并使其成为空终止符? 还是溢出到int数? 这个表格有什么问题吗?
如果代码是:
char str[3] = "ABC";
它在C中很好,但字符数组str
不是字符串,因为它不是以空值终止的。 见C FAQ:char a [3] =“abc”; 法律? 这是什么意思? 细节。
在你的例子中:
char str[4] = "ABC\0";
数组str
的最后一个字符碰巧被设置为'\\0'
,所以它很好,它是一个字符串。
C99标准§6.7.8.¶14说
字符类型数组可以由字符串文字初始化,可选地用大括号括起来。 字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。
这意味着以下陈述是等效的。
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
,则只有文字"ABC\\0"
中的前4
字符用于其初始化,如上面引用的标准段中明确提到的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.