静态大小的字符串声明

时间:2019-04-02 12:03:04

标签: c string declaration

我正在尝试以不同的方式在C中声明字符串以准备考试。我们知道C中的字符串是结尾为char str[] = {'a','b','c','d','e'}; char str2[] = "abcde"; char str3[5] = "abcde"; 的字符数组。然后,我发现即使我声明了一个5个字符的数组并将5个字符放入其中,例如“ abcde”,它也被接受。那空字符存储在哪里?

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

strlen()

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

在第三种情况下,不附加空终止符。来自documentation

  

如果知道数组的大小,则可能比数组的大小小1   字符串文字,在这种情况下,终止空字符为   已忽略:

因此,当您使用strlen检查其长度时,会得到未定义的行为(与第一个尝试的行为相同,因为它也不是字符串)。

除此以外,不允许这样做(对我来说,在MSVC上它显示错误,但由于某种原因仍会编译)。超出允许的字符串长度,在这种情况下,其余的将零初始化。