这是初始化数组的正确方法吗?

时间:2016-08-23 10:42:21

标签: c arrays

这是初始化数组的一种不常见的方法:

 int a[3] = {[2] 5, [0] 10, [1] 15};

在程序中使用此数组

#include <stdio.h>

int main() {
    //code
    int a[3] = {[2] 5, [0] 10, [1] 15};
    printf("a[0] = %d  a[1] = %d   a[2] = %d\n", a[0], a[1], a[2]);
    return 0;
}

输出:

a[0] = 10  a[1] = 15   a[2] = 5

在线编译器链接: http://code.geeksforgeeks.org/4onQAI

所以,我有一个问题:

这是初始化数组的正确方法吗?

3 个答案:

答案 0 :(得分:19)

关闭。正确的方法如下:

int a[3] = {[2] = 5, [0] = 10, [1] = 15};

这是指定的初始化程序,它允许您初始化指定的元素。未指定的任何元素都设置为0.

这在C standard的第6.7.9节中有详细说明。

您显示的语法是某些编译器支持的非标准扩展,特别是GCC。如果您使用-pedantic进行编译,则会收到以下警告:

  

警告:过时使用没有'='的指定初始化程序

答案 1 :(得分:11)

您的代码段对此指定的初始值设定项使用了过时的语法:

int a[3] = {[2] = 5, [0] = 10, [1] = 15};
  

自GCC 2.5以来已经过时的替代语法已经过时,但GCC仍然接受的是在元素值之前写'[index]',没有'='。 (reference

省略=不是标准,不应用于新开发。

答案 2 :(得分:7)

使用指定初始值设定项的正确方法是

int a[3] = {[2] = 5, [0] = 10, [1] = 15};  

根据C标准,=和值之间应该有[index] 初始化的方式可能是一些扩展。

用于初始化的语法(C11-§6.7.9)

    initializer:
        assignment-expression
        { initializer-list }
        { initializer-list , }
    initializer-list:
        designationopt initializer
        initializer-list , designationopt initializer
    designation:
        designator-list =
    designator-list:
    designator
        designator-list designator
    designator:
        [ constant-expression ]
        . identifier