结构数组,指定初始化程序含义

时间:2015-08-20 19:02:37

标签: c initialization

我已经知道:

1)数组"部分初始化"

int array[10] = {1};

导致初始化数组[0]的值为1,所有其他数组的值为0。

2)指定的初始化者

struct metadata {
    int val0;
    int val1;
    char *name;
};

void func(void){
    struct metadata my_metadata = { .val0 = 1 };

初始化my_metadata.val0为1,my_metadata.val1为0,my_metadata.name为NULL。

3)问题出现了:

struct metadata {
    int val0;
    int val1;
    char *name;
};

void func(void){
    struct metadata my_metadata_array[2] = { {.val0 = 1} };

这将产生什么样的操作?

奖金问题1:有人可以指向我参考文档"部分初始化" (我不知道它是编译器扩展还是特定标准版本的一部分)?

奖金问题2:与#34;指定初始化者"的奖金问题1相同。

2 个答案:

答案 0 :(得分:4)

就像在“部分初始化”中一样,第一个metadata元素将被初始化,val0元素设置为1,该元素中的所有其他元素和第二个元素将被默认初始化(或相同)作为具有静态持续时间的对象。)

奖金1:它已成为标准的一部分

C标准6.7.9-21:

  

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

奖金2:它是C99的一部分

C标准6.7.9-7

  

如果指定人员有表格   。识别码   然后当前对象(下面定义)应具有结构或联合类型和   identifier应该是该类型成员的名称。

答案 1 :(得分:1)

是(你的思维方式很好),这就是结果,它会将该变量设置为1并默认初始化其余变量。

示例:

#include <stdio.h>

struct metadata {
    int val0;
    int val1;
    char *name;
};

int main(void){
    struct metadata my_metadata_array[2] = { {.val0 = 1} };
    printf("%d %d %s\n", my_metadata_array[0].val0,  my_metadata_array[0].val1,  my_metadata_array[0].name);
    printf("%d %d %s\n", my_metadata_array[1].val0,  my_metadata_array[1].val1,  my_metadata_array[1].name);
    return 0;
}

输出:

1 0 (null)
0 0 (null)