静态大小的字符串声明

Character string declaration with static size

我正在尝试用不同的方式在 C 语言中声明一个字符串来准备考试。我们知道C语言中的string就是以'[=11=]'结尾的字符数组。然后我发现即使我声明一个5个字符的数组并像"abcde"一样在其中放入5个字符它也是被接受的。那么空字符存储在哪里?

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

char str[] = {'a','b','c','d','e'};
char str2[] = "abcde";
char str3[5] = "abcde";

现在,在第 3 种情况下,我分配了 space 的 5 个字节并且我在数组中恰好有 5 个字符,那么如果字符串末尾应该有一个空字符,它存储在哪里?还是没有附加 null 的情况? 第一种和第二种情况呢,那里附加了 null 吗? strlen() returns 3 种情况均为 5。

第三种情况,没有追加空终止符。来自 documentation:

If the size of the array is known, it may be one less than the size of the string literal, in which case the terminating null character is ignored:

所以当你用 strlen 检查它的长度时,你会得到未定义的行为(当你用第一个尝试它时也是如此,因为它也不是字符串)。

任何不允许的,(对我来说,在 MSVC 上它显示错误但由于某种原因仍然编译它)。允许超过字符串长度,在这种情况下,其余部分将被零初始化。

NUL字符仅存储在第二个示例中

char str2[] = "abcde";

自动调整数组大小以包含它。字符数组 没有 是字符串,另外两个是没有 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);
}

程序输出:

5
6
5