9a3*_*edi 3 c string initialization c-strings
我一直在阅读一些代码,我遇到了以下内容:
int function(){
char str[4] = "ABC\0";
int number;
/* .... */
}
Run Code Online (Sandbox Code Playgroud)
通常,当你编写一个字符串文字来初始化一个char数组时,该字符串应该是null隐式终止对吗?在这种情况下会发生什么?编译器是否识别字符串文字中的'\ 0'并使其成为空终止符?还是溢出到int数?这个表格有什么问题吗?
如果代码是:
char str[3] = "ABC";
Run Code Online (Sandbox Code Playgroud)
它在C中很好,但字符数组str不是字符串,因为它不是以空值终止的.见C FAQ:char a [3] ="abc"; 法律?这是什么意思?细节.
在你的例子中:
char str[4] = "ABC\0";
Run Code Online (Sandbox Code Playgroud)
数组的最后一个字符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'};
Run Code Online (Sandbox Code Playgroud)
所以上面的第一个陈述没有错.正如标准明确指出的那样,只有字符串文字中的那么多字符用于初始化数组作为数组的大小.请注意,字符串文字"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'};
Run Code Online (Sandbox Code Playgroud)
这是因为字符串文字"ABC\0"包含5字符,并且在未指定str数组大小的初始化时使用所有这些字符str.与此相反,当大小str明确表示为时4,则只有4文字"ABC\0"中的第一个字符用于其初始化,如上面引用的标准段中明确提到的那样.