C 编译器是否总是在数组末尾添加 Sentinel 值 0?

Xin*_* Li 0 c arrays

int是否会在元素数组的末尾添加哨兵值

int grades[5] = {78, 76, 75, 71, 88};
Run Code Online (Sandbox Code Playgroud)

如果上述答案是“是”,那么即使最后两个元素已默认设置为 0(例如下面的代码),哨兵值是否始终会被添加?

int grades[5] = {78, 76, 75, 0,};
Run Code Online (Sandbox Code Playgroud)

Adr*_*ica 6

编译器唯一一次添加“哨兵”零元素是在使用字符串文字 \xe2\x80\xa6 初始化字符数组时,并且只有在数组中有足够空间的情况下。

\n

例如,以下行将初始化一个包含四个字符的数组,并将该\'\\0\'字符添加为最后一个元素(因为数组的大小由指定的初始值设定项列表确定:

\n
char str[] = "abc"; // 4 chars, including nul terminator\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果显式给出大小,则nul仅当数组足够大时才会添加最后一个字符:

\n
char s1[4] = "abc"; // s1 will be a nul-terminated string\nchar s2[3] = "abc"; // s2 is an array of 3 chars WITHOUT a nul-terminator\n
Run Code Online (Sandbox Code Playgroud)\n

对于所有其他数组类型,如果初始值设定项列表中指定的元素数量小于声明的数组大小,则初始值设定项列表最后一个元素之外的所有元素都将初始化为零:

\n
int arr[5] = {0, 1, 2}; // arr[3] and arr[4] will be initialized to zero\n
Run Code Online (Sandbox Code Playgroud)\n

C语言没有真正的“哨兵”的概念来标记数组的结束;nul然而,当使用字符数组(又名 C 字符串)时,实践(或规则)是用零 ( ) 字符 \xe2\x80\x93标记字符串的结尾,并且所有采用字符串参数的标准库函数都期望该规则被遵循(并依赖它)。

\n