7

我想知道两者之间是否有区别:

char s[32] = "";

和:

char s[32] = {0};

谢谢。

4

5 回答 5

18

不,两种声明之间没有区别:

char bla[32] = {0};

and

char bla[32] = "";

请参阅 C 标准的相关段落(强调我的):

(C99, 6.7.8p21) “如果大括号括起来的列表中的初始化程序少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。”

于 2012-04-25T13:16:22.730 回答
10

在这种情况下,没有区别,两者都将数组的所有槽初始化为 0。通常,""仅适用于char 数组(有或没有类似constor的修改unsigned),但{0}适用于所有数字类型的数组。

在标准 (n1570) 的第 6.7.9 节中,第 21 点为

如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同。

所以甚至""初始化完整的数组。

于 2012-04-25T13:16:11.520 回答
2

两个表达式的结果是一样的:一个空字符串。但是,第一个更明确,因此更具可读性。

于 2012-04-25T13:16:58.080 回答
2

没有区别。你也可以亲眼看看!这是你能得到的最可靠的答案。只需使用调试器。执行这两行并比较结果。但是你应该重命名数组。我使用 gcc/gdb 并编译以下代码

int main(int argc, char* argv[])
{
    char s[5] = {0};
    char t[5] = "";
    return 0;
}

通过 gcc -g test.c 然后调用 gdb a.out。在 gdb 我输入

break 5
run
print s

最后一条语句由 gdb 回答,输出如下:

$1 = "\000\000\000\000"

我继续并输入“print t”并得到相应的

$2 = "\000\000\000\000"

这告诉我,使用我选择的编译器,两个语句都会产生相同的结果。

于 2012-04-25T13:18:49.367 回答
2

除了已经说过的:

char s[32] = "";

=

char s[32] = {'\0'};

=

char s[32] = {0};

=

char s[32] = {0, 0, 0, /* ...32 zeroes here*/ ,0 };

所有这些都将产生完全相同的机器代码:一个全零填充的 32 字节数组。

于 2012-04-25T13:27:20.750 回答