为什么我不能用局部结构初始化在C malloced结构(why can't I use pa

2019-10-21 22:01发布

Apperently在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

我知道这是愚蠢的,但没有任何语法或技术原因,我不能这样做呢?

Answer 1:

有结构的初始化,并分配之间的差异。

当使用堆内存,它总是分配,因为初始化时,你实际上声明实例(不只是一个指针实例)才会发生。

您可以使用复合文字 :

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

不过,当然,这可能是不止做更糟:

ms->a = 0;

因为它将写入结构的各个领域,设置了未在字面为零提到的所有领域。 根据你所需要的,这可能是不必要的昂贵。



Answer 2:

那么,这并不适用于在堆结构。

是。 它不会。 这是因为在初始化分配的差异。 的情况下

sometype a = {.a =0};  

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

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

有分配。



文章来源: why can't I use partial struct initialization for a malloced struct in C
标签: c struct alloc