使用 {0}、{0,} 进行数组初始化的含义是什么?

41

假设我想初始化myArray数组

char myArray[MAX] = {0};  
char myArray[MAX] = {0,};  
char myArray[MAX]; memset(myArray, 0, MAX);  
他们都是相等的,还是有一个比另一个更好一些?
谢谢。

只有最后一个初始化所有元素,而不仅仅是第一个吗? - edA-qa mort-ora-y
2
不,它们都会初始化每个元素。在前两个中,第一个元素明确为零,其余元素隐式为零;在最后一个中,它们都明确设置为零。 - user541686
1
@edA:在C语言中,不存在“部分初始化”的概念。一个对象要么完全初始化,要么完全未初始化。 - pmg
2
@Mehrdad - 这是不正确的。例如,尝试这样做:unsigned int test[32] = {0xDEADBEEF}; // 数组将只包含一个元素,其中包含0xDEADBEEF - Brian Vandenberg
2
@BrianVandenberg:这与我所说的有何矛盾之处? - user541686
6个回答

48

实际上,在C++中,我个人建议:

char myArray[MAX] = {};

它们都做同样的事情,但我更喜欢这个C++中更加简洁的写法。 (很遗憾,在C中它不是有效的。)

顺便说一句,请注意char myArray[MAX] = {1};不能将所有值初始化为1!它只会将第一个值初始化为1,其余为零。因此,尽管它可以正常工作,但我建议您不要编写char myArray[MAX] = {0};,因为它对某些人来说会有点误导性。


26

在生成的代码方面,它们是等价的(至少在优化过的构建中),因为当使用{0}语法初始化数组时,所有未明确指定的值都会隐式地初始化为0,并且编译器将足够了解以插入对memset的调用。

唯一的区别在于风格。选择取决于您使用的编码标准或个人偏好。


4
我认为你应该阐述{0}和{ }之间的区别。虽然结果相同,但含义不同。如果没有这些信息,可能会让某些人误以为{1}会将所有内容初始化为1,这是错误的(如在@Mehrdad的答案中所述)。 - amfcosta

6

我认为第一种解决方案是最好的。

char myArray[MAX] = {0};  //best of all

1

两种方式都可以使用

但我觉得下面的更易于理解和阅读...

  char myArray[MAX]; 
  memset(myArray, 0, MAX);

1

假设您始终希望初始化为0。

--> 您的第一种方法和第二种方法是相同的。我更喜欢第一种。

--> 当您想要分配0而不是初始化时,应使用memset()的第三种方式。

--> 如果预计仅对该数组进行一次初始化,则可以在其前面放置static关键字,以便编译器为您完成工作(无运行时开销)。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接