为什么 sizeof() 在这个例子中不包含 NUL 字节?

Why doesn't sizeof() doesn't include the NUL byte in this example?

让我们考虑以下示例:

int main()
{
    char some_string[] = "12345678";
    printf("%zu", sizeof(some_string));

    return 0;
}

输出

9
...Program finished with exit code 0
Press ENTER to exit console.`

以上正确。 some_string 变量的大小是 8 个字符 + NUL 字节 = 9


现在,如果我们稍微将其更改为:

int main()
{
    char some_string[8] = "12345678";
    printf("%zu", sizeof(some_string));

    return 0;
}

它打印:

8
...Program finished with exit code 0
Press ENTER to exit console.`

为什么后一种情况会忽略 NUL 字节?

在 C 语言中,当在定义中为数组提供大小时,无论初始化程序如何,数组都是该大小。该大小或更小的字符串文字可用于初始化字符数组,而恰好大小不包括空字符的字符串文字可用于初始化数组。 C 2018 6.7.9 14 说:

An array of character type may be initialized by a character string literal or UTF–8 string literal, optionally enclosed in braces. Successive bytes of the 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.

这是允许的,因为有时字符数组用作纯数据(例如,用作 look-up 表)而不是用作 null-terminated 字符串,但使用字符串文字可能更方便初始化它们。

与 C++ 不同的是,在 C 中,允许使用字符串文字初始化字符数组,使其不包含空终止字符,方法是限制数组的长度,以便它是不含空字符的字符串长度。