静态大小的字符串声明

Kus*_*dal 2 c string declaration

我正在尝试以不同的方式在C中声明字符串以准备考试。我们知道C中的字符串是'\0'结尾处的字符数组。然后我发现,即使我声明了一个5个字符的数组并将5个字符放入其中,例如“ abcde”,它也被接受。那么,空字符存储在哪里?

我以以下方式声明了字符串

char str[] = {'a','b','c','d','e'};
char str2[] = "abcde";
char str3[5] = "abcde";
Run Code Online (Sandbox Code Playgroud)

现在,在第3种情况下,我要分配5个字节的空间,并且数组中恰好有5个字符,那么如果string的末尾应将空字符存储在哪里?还是不附加null的情况?第一种情况和第二种情况如何,那里是否附加了null? strlen()在所有3种情况下均返回5。

Wea*_*ane 6

NUL字符只存储在第二示例

char str2[] = "abcde";
Run Code Online (Sandbox Code Playgroud)

数组自动调整大小以包含它的位置。字符数组不具有是一个字符串,而另外两个没有被编码NUL终止子。

如果代码碰巧将它们正确地视为字符串,那是未定义行为的不幸结果。

#include <stdio.h>

int main(int argc, char *argv[])
{
    char str[] = {'a','b','c','d','e'};
    char str2[] = "abcde";
    char str3[5] = "abcde";
    printf("%zu\n", sizeof str);
    printf("%zu\n", sizeof str2);
    printf("%zu\n", sizeof str3);
}
Run Code Online (Sandbox Code Playgroud)

程序输出:

5
6
5