我已经知道:
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相同。
答案 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)