为什么gcc会说这是一个;无效的初始值设定项";?

为什么gcc会说这是一个;无效的初始值设定项";?,c,C,在分配foo1的行中,我得到“无效初始值设定项”。如果我将类型更改为Foo*,它将编译。但是如果我执行foo1->blah=3,程序就会崩溃 为什么数组元素的类型是Foo*而不是Foo?为什么程序会崩溃?arr是一个Foo*数组,因此您不能在此处将arr元素分配给Foo: typedef struct { int blah; int bleh; } Foo; typedef struct { int a; int b; Foo* arr[]; } Bar

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


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

arr
是一个
Foo*
数组,因此您不能在此处将
arr
元素分配给
Foo

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;
}
第二个问题是,即使您为
arr
正确分配内存,您也需要初始化每个
指针
,否则您将取消对未初始化指针的引用,该指针是未定义的行为

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

 Foo foo1 = bar->arr[0];
那么代码的其余部分就不会更改


这是在
C99
中介绍的用法,这里的答案是关于如何正确分配和释放的。

arr
Foo*
的数组,因此您不能在此处将
arr
元素分配给
Foo

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;
}
第二个问题是,即使您为
arr
正确分配内存,您也需要初始化每个
指针
,否则您将取消对未初始化指针的引用,该指针是未定义的行为

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

 Foo foo1 = bar->arr[0];
那么代码的其余部分就不会更改


这是在
C99中介绍的用法,这里的答案讨论如何正确分配和释放。

Foo*arr[]
是指针数组,因此
bar->arr[0]
是指针

这很好:

typedef struct
{
    int a;
    int b;
    Foo arr[];
} Bar;
要创建
Foo
的对象,可以使用以下任一方法

Foo* foo1 = bar->arr[0];

Foo*arr[]
是指针数组,因此
bar->arr[0]
是指针

这很好:

typedef struct
{
    int a;
    int b;
    Foo arr[];
} Bar;
要创建
Foo
的对象,可以使用以下任一方法

Foo* foo1 = bar->arr[0];

数组元素的类型是
Foo*
,因为这正是您声明它们的方式。声明
Foo*arr[]
代表
Foo*
元素的数组。当您在声明中明确表示
Foo*
时,为什么您希望元素是
Foo

foo1
的类型更改为
Foo*
看起来像是随机更改,没有多大意义。你想做什么?这是你应该首先回答的问题。在
条的末尾需要什么样的数组
Foo-arr[]
Foo*arr[]


根据您的
malloc
判断,您似乎想要在
Bar
的末尾声明一个
Foo
元素数组。如果是这样,您必须将数组声明更改为
Foo arr[]

数组元素的类型是
Foo*
,因为这正是您声明它们的方式。声明
Foo*arr[]
代表
Foo*
元素的数组。当您在声明中明确表示
Foo*
时,为什么您希望元素是
Foo

foo1
的类型更改为
Foo*
看起来像是随机更改,没有多大意义。你想做什么?这是你应该首先回答的问题。在
条的末尾需要什么样的数组
Foo-arr[]
Foo*arr[]


根据您的
malloc
判断,您似乎想要在
Bar
的末尾声明一个
Foo
元素数组。如果是这样,您必须将数组声明更改为
Foo-arr[]

“为什么数组元素的类型是Foo*”——因为,当然,您将它们声明为与
Foo*arr[]
“为什么数组元素的类型是Foo*”——因为,当然,您将它们声明为与
Foo*arr[]