我想知道:
之间是否存在差异char s[32] = "";
和
char s[32] = {0};
感谢。
答案 0 :(得分:18)
两个声明之间没有区别:
char bla[32] = {0};
and
char bla[32] = "";
参见C标准的相关段落(强调我的):
(C99,6.7.8p21)“如果括号括起的列表中的初始值设定项少于聚合的元素或成员,则字符串文字中的或更少的字符用于初始化已知大小的数组比数组中的元素大,数组的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。“
答案 1 :(得分:10)
在这种情况下,没有区别,都将数组的所有插槽初始化为0.通常,""
仅适用于char
数组(有或没有const
之类的修改或unsigned
),但{0}
适用于所有数字类型的数组。
在标准(n1570)的第6.7.9节中,第21点读取
如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,其余的聚合应该是 隐式初始化与具有静态存储持续时间的对象相同。
所以偶然""
初始化整个数组。
答案 2 :(得分:2)
两个表达式的结果是相同的:一个空字符串。但是,第一个更明确,因此更具可读性。
答案 3 :(得分: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"
告诉我,使用我选择的编译器,两个语句都会产生相同的结果。
答案 4 :(得分:2)
除了已经说过的内容之外:
char s[32] = "";
=
char s[32] = {'\0'};
=
char s[32] = {0};
=
char s[32] = {0, 0, 0, /* ...32 zeroes here*/ ,0 };
所有这些都会导致完全相同的机器代码:一个32字节的数组,用全零填充。