为什么可以';我对C中的malloced结构使用部分结构初始化

为什么可以';我对C中的malloced结构使用部分结构初始化,c,struct,alloc,C,Struct,Alloc,显然,在C99中,您可以用这种方式简单地初始化静态分配的结构 struct sometype { int a; double b; }; sometype a = { .a = 0; }; 这不适用于像这样的堆上的结构 struct sometype *a = malloc(sizeof(struct sometype)); *a = { .a = 0; }; 对于GCC4.9.2,编译器抱怨 error: expected expression before '{

显然,在C99中,您可以用这种方式简单地初始化静态分配的结构

struct sometype {
   int a;
   double b;
};
sometype a = {
   .a = 0;
};
这不适用于像这样的堆上的结构

struct sometype *a = malloc(sizeof(struct sometype));
*a = {
   .a = 0;
 };
对于GCC4.9.2,编译器抱怨

error: expected expression before '{' token

我知道这很愚蠢,但有没有语法或技术原因使我不能这样做?

结构初始化和赋值之间有区别

在使用堆内存时,它始终是赋值,因为只有在实际声明实例(而不仅仅是指向实例的指针)时才会发生初始化

您可以使用:

但当然,这可能比仅仅做更糟糕:

ms->a = 0;

因为它将写入结构的所有字段,所以将文本中未提及的所有字段设置为零。根据您的需要,这可能会产生不必要的成本。

结构初始化和赋值之间存在差异

在使用堆内存时,它始终是赋值,因为只有在实际声明实例(而不仅仅是指向实例的指针)时才会发生初始化

您可以使用:

但当然,这可能比仅仅做更糟糕:

ms->a = 0;
因为它将写入结构的所有字段,所以将文本中未提及的所有字段设置为零。根据您的需要,这可能是不必要的昂贵

这不适用于堆上的结构

对。不会的。这是因为初始化和赋值是不同的。万一

sometype a = {.a =0};  
这是初始化。在动态分配的情况下

sometype *a = malloc(sizeof(struct sometype);
*a = {.a =0};   
有一项任务

这不适用于堆上的结构

对。不会的。这是因为初始化和赋值是不同的。万一

sometype a = {.a =0};  
这是初始化。在动态分配的情况下

sometype *a = malloc(sizeof(struct sometype);
*a = {.a =0};   

有任务。

你答应的malloc在哪里?你知道没有一种类型叫做sometype吗?只有一个struct sometype,而不是sometype。@gnasher729好吧,那只是一个例子,我没有那么在意,因为第二段代码很重要。你承诺的malloc在哪里?你知道没有一种类型叫做sometype吗?只有一个结构sometype,而不是sometype。@gnasher729好吧,那只是一个例子,我没有那么在意,因为第二段代码很重要。你的最后一句话不是真的。如果初始值设定项列表中缺少子对象,它将被隐式初始化为(非随机)默认值(参见C99规范,6.7.8.19)。所以
*ms=((struct sometype){.a=0})
ms->b
设置为
0.0
。您的最后一句话不是真的。如果初始值设定项列表中缺少子对象,它将被隐式初始化为(非随机)默认值(参见C99规范,6.7.8.19)。因此
*ms=((struct sometype){.a=0})
ms->b
设置为
0.0