使用花括号初始化C char数组,是否可以省略空字节'\ 0'?

时间:2011-02-26 13:04:22

标签: c character-arrays

所以我读到了:

char pattern[] = "ould";

基本上是更简单的写作方式:

char pattern[] = { 'o', 'u', 'l', 'd', '\0' };

我知道空字符\0标记了字符串的结尾,但如果我这样写它会怎么样:

char pattern[] = { 'o', 'u', 'l', 'd'};(没有\ 0)

它仍在编译。

没有pattern的{​​{1}}会导致问题,因为它似乎是在没有警告的情况下编译的(\0

8 个答案:

答案 0 :(得分:10)

如果你没有终止零,你不再有一个空终止字符串,只是一个char数组,所以将它传递给任何需要字符串的函数都是错误的。例如。 strlen,作为strcpy的源参数,...参数printf %s格式说明符等。

答案 1 :(得分:3)

这种行为有什么问题?最后有一个没有'\ 0'的char数组是完全有效的。它只是一个阵列。 '\ 0'存在的唯一原因是分隔字符串。如果你知道长度是多少,你就不需要了!

Char数组与其他数组不同。唯一需要'\ 0'的是标准字符串函数。

答案 2 :(得分:2)

它不是编译器警告,而是逻辑警告。如果您在没有strcpy的情况下使用\0,则可能会损坏您的筹码。

答案 3 :(得分:2)

它不会导致编译器出现问题,导致问题的是许多函数,例如printf假设当您使用%s格式说明符传递内容时,它将被'\ 0'终止。

但是如果你只是将这个数组传递给你编写的函数,或者将数组的长度作为一个单独的参数传递给它们,那么它们都知道它会持续多长时间不会引起问题。

答案 4 :(得分:1)

如果您将其视为字符串,则会出现问题。例如,使用strcmp,strcpy,printf。他们都期望找到空终止符,因此肯定会遇到问题。

只要您将字符数组视为一个字符数组,就可以使用普通的旧字符数组。例如

char c = pattern[2];

答案 5 :(得分:1)

当然它编译 - 它是一个有效的C程序。如果您尝试将字符数组传递给期望以null结尾的字符串(以'\ 0'结尾的字符数组)的函数,则会出现问题。

答案 6 :(得分:1)

例如,获取字符串的长度将产生不可预测的结果 strlen(pattern)

答案 7 :(得分:1)

char string[] = "abcd"; /*is valid at the end is the \0, 5 chars were allocated*/

char str[3] = {'\0'}; /* all are \0 */

strncpy(str, string, 2); /*strcpy doesn't add \0*/

str[3] = '\0'; /* now is everything fine! */