3

这个初始化是什么意思:

char arr[10] = { 0, };

我熟悉char arr[10] = {0};哪个将所有元​​素设置为零,以及char arr[10] = {1,2};哪个将前两个元素设置为 1 和 2(ascii),其余设置为 0。我不熟悉上面的格式。快速测试表明它可能就像char arr[10] = {0};,但还有其他我不知道的含义吗?

4

5 回答 5

7

如何将数组的所有成员初始化为相同的值?

将所有成员初始化为相同的值:

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

缺失值的元素将被初始化为 0:

int myArray[10] = { 1, 2 }; //initialize to 1,2,0,0,0...

所以这会将所有元素初始化为0:

int myArray[10] = { 0 }; //all elements 0

在 C++ 中,一个空的初始化列表也会将每个元素初始化为 0:

int myArray[10] = {}; //all elements 0 in C++

如果未指定初始化程序,则具有静态存储持续时间的对象将初始化为 0:

static int myArray[10]; //all elements 0

如果您的编译器是 GCC,您可以使用以下语法:

int array[1024] = {[0 ... 1023] = 5};
int A[10] = {[0 ... 4] = 5, [5 ... 9] = 3};
于 2013-05-07T08:41:53.437 回答
6

是的,它与不带逗号的版本等效。

有关尾随逗号的更多讨论,请参阅此问题

于 2013-05-07T08:33:57.160 回答
2

作为标准

A trailing comma may appear after the last expression in an array initializer and is ignored

于 2013-05-07T08:48:37.943 回答
1

char arr[10] = { 0, };char arr[10] = {0}在这种情况下是相同的。

char arr[10] = {5, }不一样。5 将存储在 a[0] 中,剩余的将用零填充。

我建议不要将它用于全局变量,因为它会增加数据段的大小。

于 2013-05-07T08:38:24.453 回答
1

int arr[3] ={0,}; 和 之间没有区别 int arr[3] ={0};

参考:C11 6.7.9:

    initializer:
         assignment-expression
         { initializer-list }
         { initializer-list , }

两种形式的初始化器列表都被认为是初始化器。许多人更喜欢末尾带有逗号的表单,因为它可以在代码维护期间更轻松地重新排列或添加元素到列表中。

 int arr[3] ={0,}; 

声明一个包含三个元素的数组并将第一个元素初始化为 0。当您进行部分初始化时,数组的其余部分会自动用零初始化。

参考。C11 6.7.9:

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

[我为另一个问题写了这个答案,但它被关闭了。不过我喜欢这个答案,所以我重新发布了原来的问题。]

于 2016-07-20T16:32:51.087 回答