gpt4 book ai didi

c - 为什么 gcc 说这是一个 "invalid initializer"?

转载 作者:太空宇宙 更新时间:2023-11-04 05:41:43 27 4
gpt4 key购买 nike

typedef struct
{
int blah;
int bleh;
} Foo;

typedef struct
{
int a;
int b;
Foo* arr[];
} Bar;

int main(int argc, char **argv)
{
Bar* bar = malloc(sizeof(Bar) + sizeof(Foo) * 5);
Foo foo1 = bar->arr[0];
return 0;
}

在分配 foo1 的那一行,我得到“无效的初始值设定项”。如果我将类型更改为 Foo*,它会编译。但是如果我执行 foo1->blah = 3,程序就会崩溃。

为什么数组元素的类型是Foo*而不是Foo?为什么程序会崩溃?

最佳答案

arrFoo* 的数组,因此您不能将 arr 的元素分配给 Foo这里:

 Foo foo1 = bar->arr[0];

第二个问题是,即使您正确地为 arr 分配内存,您也需要初始化每个 pointer,否则您将取消引用未初始化的指针,这是未定义的行为.

如果你想要一个 Foo 的数组,那么这就是你想要的:

typedef struct
{
int a;
int b;
Foo arr[];
} Bar;

然后您的其余代码不会更改。

这是使用 flexible array membersC99 中引入,这里的答案讨论如何正确分配和释放。

关于c - 为什么 gcc 说这是一个 "invalid initializer"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16804166/

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