2012-04-25 207 views
7

我想知道是否有之间的差异:{0}和“”之间有什么区别?

char s[32] = ""; 

和:

char s[32] = {0}; 

感谢。

+0

答案已经给出。但是,如果你现在应该考虑''{0}'和''''没有什么区别,可以用其他类型来尝试,例如'int'数组而不是'char'数组。然后你会看到不同之处。 – 2012-04-25 13:31:27

回答

18

不存在双方的声明没有区别:

char bla[32] = {0}; 

and 

char bla[32] = ""; 

见C标准(重点煤矿)的有关段落:

(C99,6.7.8p21)“如果有在大括号内的列表中的元素或成员的个数比元素或成员更少,在字符串文字中使用或更少的字符用于初始化比数组中的元素大小的已知大小的数组,集合的其余部分应为初始化s作为具有静态存储时间的对象。“

+0

好的,非常感谢! – md5 2012-04-25 13:26:45

+1

也就是说,只要''\ 0'== 0'。 – Philip 2012-04-25 14:22:11

+2

@Philip我没有标准的引用,但是这是K&R 2nd的说法*“字符常量'\ 0'表示字符的值为零,空字符。'\ 0'通常被写入而不是0 “* – ouah 2012-04-25 15:00:56

10

在这种情况下,没有差别,这两种初始化所述阵列的所有时隙为0。在一般情况下,""仅对char阵列的工作原理(具有或不具有像constunsigned修改),但{0}作品所有数值的阵列类型。

在标准(n1570)第6.7.9,点21读取

如果在一个大括号内的列表更少初始化比有元件或部件的集合体 ,或更少的字符在用于初始化数组的已知大小的数组的字符串文字中,其余的数据集合应为 ,隐式地初始化为与具有静态存储持续时间的对象相同。

所以即使""初始化完整的数组。

+0

+1'{0}'适用于任何允许使用初始值设定项的数据类型。另一方面,它不适用于所有阵列,即不适用于VLA,因为它们不能有初始化器。 – 2012-04-25 14:10:21

2

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

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" 

我继续,进入 “印花T”,并得到相应的

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

告诉我用我的编译器选择这两个语句导致相同的结果。

+3

Matthias:这不是最可靠的方法,因为任何未定义的行为都可能因编译器实现或由于未初始化的内存内容的不同而不同... ... – 2012-04-25 13:30:30

+0

@ tony-delroy我澄清并希望我让我的观点更清晰(我didn但是我真的不明白你的意思) – Matthias 2012-04-25 20:07:06

+1

我的观点是,要知道你的程序在特定的运行中做了什么并不能证明C++标准要求任何C++编译器从该源代码生成的任何可执行文件要做什么。如果你想要可靠的代码,你坚持标准保证的内容,因为可观察的程序行为可能会有所不同。例如,如果您从未初始化的变量中读取 - 'int x; std :: cout << x <<'\ n';' - 你可能偶然看到你期望的数字(特别是如果你期望0),但重新运行该程序或重新编译它,以及你可能会得到不同的输出.... – 2012-04-26 02:30:02

2

除了什么已经说了:

char s[32] = ""; 

=

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

=

char s[32] = {0}; 

=

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

所有这些将导致正好是相同的机器码:一个32字节的数组填充所有的零。

相关问题