为什么可以';我对C中的malloced结构使用部分结构初始化
显然,在C99中,您可以用这种方式简单地初始化静态分配的结构为什么可以';我对C中的malloced结构使用部分结构初始化,c,struct,alloc,C,Struct,Alloc,显然,在C99中,您可以用这种方式简单地初始化静态分配的结构 struct sometype { int a; double b; }; sometype a = { .a = 0; }; 这不适用于像这样的堆上的结构 struct sometype *a = malloc(sizeof(struct sometype)); *a = { .a = 0; }; 对于GCC4.9.2,编译器抱怨 error: expected expression before '{
struct sometype {
int a;
double b;
};
sometype a = {
.a = 0;
};
这不适用于像这样的堆上的结构
struct sometype *a = malloc(sizeof(struct sometype));
*a = {
.a = 0;
};
对于GCC4.9.2,编译器抱怨
error: expected expression before '{' token
我知道这很愚蠢,但有没有语法或技术原因使我不能这样做?结构初始化和赋值之间有区别 在使用堆内存时,它始终是赋值,因为只有在实际声明实例(而不仅仅是指向实例的指针)时才会发生初始化 您可以使用: 但当然,这可能比仅仅做更糟糕:
ms->a = 0;
因为它将写入结构的所有字段,所以将文本中未提及的所有字段设置为零。根据您的需要,这可能会产生不必要的成本。结构初始化和赋值之间存在差异 在使用堆内存时,它始终是赋值,因为只有在实际声明实例(而不仅仅是指向实例的指针)时才会发生初始化 您可以使用: 但当然,这可能比仅仅做更糟糕:
ms->a = 0;
因为它将写入结构的所有字段,所以将文本中未提及的所有字段设置为零。根据您的需要,这可能是不必要的昂贵
这不适用于堆上的结构
对。不会的。这是因为初始化和赋值是不同的。万一
sometype a = {.a =0};
这是初始化。在动态分配的情况下
sometype *a = malloc(sizeof(struct sometype);
*a = {.a =0};
有一项任务
这不适用于堆上的结构
对。不会的。这是因为初始化和赋值是不同的。万一
sometype a = {.a =0};
这是初始化。在动态分配的情况下
sometype *a = malloc(sizeof(struct sometype);
*a = {.a =0};
有任务。你答应的malloc在哪里?你知道没有一种类型叫做sometype吗?只有一个struct sometype,而不是sometype。@gnasher729好吧,那只是一个例子,我没有那么在意,因为第二段代码很重要。你承诺的malloc在哪里?你知道没有一种类型叫做sometype吗?只有一个结构sometype,而不是sometype。@gnasher729好吧,那只是一个例子,我没有那么在意,因为第二段代码很重要。你的最后一句话不是真的。如果初始值设定项列表中缺少子对象,它将被隐式初始化为(非随机)默认值(参见C99规范,6.7.8.19)。所以
*ms=((struct sometype){.a=0})
将ms->b
设置为0.0
。您的最后一句话不是真的。如果初始值设定项列表中缺少子对象,它将被隐式初始化为(非随机)默认值(参见C99规范,6.7.8.19)。因此*ms=((struct sometype){.a=0})
将ms->b
设置为0.0
。