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

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数?这个表格有什么问题吗?

Yu *_*Hao 6

如果代码是:

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',所以它很好,它是一个字符串.

  • @Marco是的,这是C和C++之间的差异之一.相同的代码在C++中无效. (2认同)

aja*_*jay 6

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"中的第一个字符用于其初始化,如上面引用的标准段中明确提到的那样.