在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
我知道这很愚蠢,但是有什么语法或技术原因我不能这样做吗?
答案 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};
有作业。