在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)
我知道这很愚蠢,但是有什么语法或技术原因我不能这样做吗?
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)
因为它会写信给所有结构的领域,设置了未在字面为零提到的所有领域.根据您的需要,这可能是不必要的昂贵.