结构数组,指定初始化器蕴涵
Array of structure, designated initializer implication
我已经知道了:
1)数组"partial initialization"
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:有人可以指点我 "partial initialisation" 的参考文档吗(我不知道它是编译器扩展还是特定标准版本的一部分)?
奖励问题 2:与 "designated initializers" 的奖励问题 1 相同。
就像在 "partial initialization" 中一样,第一个 metadata
元素将初始化为 val0
元素设置为 1,该元素中的所有其他元素和第二个元素将被默认初始化(或与具有静态持续时间的对象相同)。
好处 1:它已经成为标准的一部分
C 标准 6.7.9-21:
If there are fewer initializers in a brace-enclosed list than there are elements or members
of an aggregate, or fewer characters in a string literal used to initialize an array of known
size than there are elements in the array, the remainder of the aggregate shall be
initialized implicitly the same as objects that have static storage duration.
奖励 2:它是 C99 的一部分
C 标准 6.7.9-7
If a designator has the form
. identifier
then the current object (defined below) shall have structure or union type and the
identifier shall be the name of a member of that type.
是的(你的想法很好),这就是结果,它会将那个变量设置为 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)
我已经知道了:
1)数组"partial initialization"
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:有人可以指点我 "partial initialisation" 的参考文档吗(我不知道它是编译器扩展还是特定标准版本的一部分)?
奖励问题 2:与 "designated initializers" 的奖励问题 1 相同。
就像在 "partial initialization" 中一样,第一个 metadata
元素将初始化为 val0
元素设置为 1,该元素中的所有其他元素和第二个元素将被默认初始化(或与具有静态持续时间的对象相同)。
好处 1:它已经成为标准的一部分
C 标准 6.7.9-21:
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
奖励 2:它是 C99 的一部分
C 标准 6.7.9-7
If a designator has the form . identifier then the current object (defined below) shall have structure or union type and the identifier shall be the name of a member of that type.
是的(你的想法很好),这就是结果,它会将那个变量设置为 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)