为什么我们将null终止符放在大括号括号char数组初始化中

时间:2016-12-20 22:32:03

标签: c

我注意到在许多书籍和在线教程中使用大括号括号列表初始化C字符串时,它是这样完成的:

char string[100] = {'t', 'e', 's', 't', '\0' };

不应该将所有未指定的值自动设置为0(又名'\0')吗?

我在GCC和MSVC的多个版本上对此进行了测试,所有值确实设置为零,但我想知道在初始化时是否有明确写入空终止符的特定原因。

3 个答案:

答案 0 :(得分:4)

你是对的(参见“从大括号列表中初始化”here)。但这是一个很好的做法,因为这也可以在没有投诉的情况下编译:

char string[4] = {'t', 'e', 's', 't'};

但不会null-terminate任何东西,只要你将它用作字符串就会导致错误。如果你说

char string[4] = {'t', 'e', 's', 't', '\0'};

编译器会知道这是一个错误,因为'\0'不适合。

请注意,它甚至优于

char string[100] = "test";

出于同样的原因:

char string[4] = "test";

与第一个例子相同,而不是第二个!

答案 1 :(得分:2)

这是为了防止愚蠢的错误。如果要将字符解释为字符串,则需要第一个空字符。

char string[4] = {'t', 'e', 's', 't'};

很乐意编译,但不会以null结尾。

char string[4] = {'t', 'e', 's', 't', '\0'};

将无法编译,这就是重点。

通过显式指定空字符,编译器将验证该数组是否足够大以达到其预期目的。

答案 2 :(得分:1)

当您明确指定字符数组的大小并且分配比字符串的有效负载部分所需的更多字符时,绝对不需要添加空终止符。在这种情况下,标准要求用零初始化剩余的字符。

唯一需要的时候是希望编译器自动确定以null结尾的数组的大小,即

char string[] = {'t', 'e', 's', 't', '\0' };
//         ^^