为什么我不能对C中的malloced结构使用部分结构初始化

时间:2015-02-16 16:02:49

标签: c struct alloc

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

struct sometype {
   int a;
   double b;
};
sometype a = {
   .a = 0;
};

好吧,这不适用于像这样的堆上的结构。

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

使用GCC 4.9.2,编译器抱怨

error: expected expression before '{' token

我知道这很愚蠢,但是有什么语法或技术原因我不能这样做吗?

2 个答案:

答案 0 :(得分:5)

struct initialization和assignment之间存在差异。

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

您可以使用compound literals

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

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

ms->a = 0;

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

答案 1 :(得分:2)

  

好吧,这不适用于堆上的结构。

是。它不会。那是因为初始化赋值存在差异。在

的情况下
sometype a = {.a =0};  

这是初始化。在动态分配的情况下

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

有作业。