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

Xee*_*hem 1 c struct alloc

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

struct sometype {
   int a;
   double b;
};
sometype a = {
   .a = 0;
};
Run Code Online (Sandbox Code Playgroud)

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

struct sometype *a = malloc(sizeof(struct sometype));
*a = {
   .a = 0;
 };
Run Code Online (Sandbox Code Playgroud)

使用GCC 4.9.2,编译器抱怨

error: expected expression before '{' token
Run Code Online (Sandbox Code Playgroud)

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

unw*_*ind 5

struct初始化和赋值之间存在差异.

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

您可以使用复合文字:

struct sometype *ms = malloc(sizeof *ms);
*ms = ((struct sometype) { .a = 0 });
Run Code Online (Sandbox Code Playgroud)

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

ms->a = 0;
Run Code Online (Sandbox Code Playgroud)

因为它会写信给所有结构的领域,设置了未在字面为零提到的所有领域.根据您的需要,这可能是不必要的昂贵.