C 结构数组,指定初始值设定项含义

C 结构数组,指定初始值设定项含义,c,initialization,C,Initialization,我已经知道: 1) 数组“部分初始化” 结果是使用值1初始化数组[0],并使用0初始化所有其他数组值 2) 指定初始值设定人 struct metadata { int val0; int val1; char *name; }; void func(void){ struct metadata my_metadata = { .val0 = 1 }; 结果是用1初始化my_metadata.val0,用0初始化my_metadata.val1,用NULL初始

我已经知道:

1) 数组“部分初始化”

结果是使用值1初始化数组[0],并使用0初始化所有其他数组值

2) 指定初始值设定人

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

void func(void){
    struct metadata my_metadata = { .val0 = 1 };
结果是用1初始化my_metadata.val0,用0初始化my_metadata.val1,用NULL初始化my_metadata.name

3) 问题来了:

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

void func(void){
    struct metadata my_metadata_array[2] = { {.val0 = 1} };
这样做的结果是什么

附加问题1:有人能给我指一下“部分初始化”的参考文档吗(我不知道它是编译器扩展还是特定标准版本的一部分)

奖金问题2:与“指定初始值设定者”的奖金问题1相同。

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

奖励1:它已经成为标准的一部分有一段时间了

C标准6.7.9-21:

如果括号内列表中的初始值设定项少于元素或成员 用于初始化已知数组的聚合或字符串文字中的更少字符 尺寸大于阵列中的元素,则骨料的剩余部分应为 与具有静态存储持续时间的对象隐式初始化相同

奖励2:它是C99的一部分

C标准6.7.9-7

如果指示符具有以下形式: .标识符 然后,当前对象(定义如下)应具有结构或联合类型,并且 标识符应为该类型成员的名称

是的(你的想法很好),这就是结果,它会将变量设置为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;
}
#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)