我正在尝试以不同的方式在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。
答案 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上它显示错误,但由于某种原因仍会编译)。超出允许的字符串长度,在这种情况下,其余的将零初始化。