- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在阅读一些代码,我遇到了以下情况:
int function(){
char str[4] = "ABC\0";
int number;
/* .... */
}
通常,当您编写字符串字面值来初始化 char 数组时,该字符串应该隐式地以 null 终止,对吗?在这种情况下会发生什么?编译器是否识别字符串文字中的“\0”并将其设为空终止符?还是溢出到整数?这个表格有什么问题吗?
最佳答案
C99 标准§6.7.8.¶14 说
An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.
这意味着下面的语句是等价的。
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"
用于其初始化,正如上面引用的标准段落中明确提到的那样。
关于c - 使用显式大小初始化 char 数组并初始化为大于该大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23149377/
我是一名优秀的程序员,十分优秀!