gpt4 book ai didi

c - 为什么不能使用复合文字来分配已定义的固定大小的数组?

转载 作者:行者123 更新时间:2023-12-04 00:00:44 26 4
gpt4 key购买 nike

为什么在使用复合文字(示例代码中的案例 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 或单独分配值。

阅读下面的评论和答案后,我想现在我的问题分解为为什么不能分配给数组的永远争论不休的难题。

this 所建议的更令人费解的是什么?发布和 M.M下面的评论是以下分配是完全有效的(当然,它违反了严格的别名规则)。您可以将数组包装在结构中并进行一些讨厌的转换来模仿可分配的数组。

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(?) 中?

最佳答案

C 没有数组赋值,根本。也就是说,如果 array 具有任何数组类型,则 array =/* something here */ 无效,无论“something here”的内容如何。它是否是复合文字(您似乎与指定的初始化程序混淆了,这是一个完全不同的概念)是无关紧要的。 array1 = array2 将同样无效。

至于 为什么 它是无效的,在某种程度上,这是 C 语言及其设计的动机/基本原理的问题,无法回答。但是,机械地,除了 sizeof 的操作数或 & 的操作数之外的任何上下文中的数组都会“衰减”为指向其第一个元素的指针。所以在这种情况下:

arr = (int[3]){[0]=1, [1]=2, [2]=3};

您正试图将 pointer to 复合文字数组的第一个元素分配给非左值(当 arr 衰减时产生的右值)。当然那是胡说八道。

关于c - 为什么不能使用复合文字来分配已定义的固定大小的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62309597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com