繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM