为什么在示例代码中使用复合文字(案例 b)定义结构后可以分配结构,而数组不能(案例 c))?
我知道情况 a) 不起作用,因为此时编译器不知道分配的 rhs 上的内存布局。它可以是任何类型的演员表。但是按照这条线,在我看来,案例 c) 是一个完全明确的情况。
typedef struct MyStruct {
int a, b, c;
} MyStruct_t;
void function(void) {
MyStruct_t st;
int arr[3];
// a) Invalid
st = {.a=1, .b=2, .c=3};
// b) Valid since C90
st = (MyStruct_t){.a=1, .b=2, .c=3};
// c) Invalid
arr = (int[3]){[0]=1, [1]=2, [2]=3};
}
编辑:我知道我不能分配给一个数组——这就是 C 的设计方式。我可以使用 memcpy 或单独分配值。
在阅读了下面的评论和答案之后,我想现在我的问题分解为一个永远争论不休的难题,即为什么不能分配给数组。
正如这篇文章和下面MM的评论所建议的那样,更令人费解的是,以下分配是完全有效的(当然,它违反了严格的别名规则)。您可以将数组包装在结构中并进行一些讨厌的转换来模仿可分配数组。
typedef struct Arr3 {
int a[3];
} Arr3_t;
void function(void) {
Arr3_t a;
int arr[3];
a = (Arr3_t){{1, 2, 3}};
*(Arr3_t*)arr = a;
*(Arr3_t*)arr = (Arr3_t){{4, 5, 6}};
}
那么是什么阻止开发人员将这样的功能包含在C22(?)