【问题标题】:why can't I use partial struct initialization for a malloced struct in C为什么我不能对 C 中的 malloced 结构使用部分结构初始化
【发布时间】:2015-02-16 16:02:49
【问题描述】:

显然在 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

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

【问题讨论】:

  • 你承诺的malloc在哪里?你意识到没有名为 sometype 的类型吗?只有 struct sometype,没有 sometype。
  • @gnasher729 嗯,这只是一个说明,我没有那么仔细,因为第二段代码很重要。

标签: c struct alloc


【解决方案1】:

结构初始化和赋值是有区别的。

当使用堆内存时,它总是赋值,因为初始化只发生在你实际声明实例时(不仅仅是一个指向实例的指针)。

你可以使用compound literals:

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

当然,这可能比仅仅这样做更糟糕:

ms->a = 0;

因为它将写入结构的所有字段,将所有未在文字中提及的字段设置为零。根据您的需要,这可能会产生不必要的成本。

【讨论】:

  • 你的最后一句话不是真的。如果初始化列表中缺少子对象,它将被隐式初始化为(非随机)默认值(参见 C99 规范,6.7.8.19)。所以*ms = ((struct sometype) { .a = 0 }) 会将ms->b 设置为0.0
【解决方案2】:

嗯,这不适用于堆上的结构。

是的。它不会。那是因为初始化赋值是有区别的。如果是

sometype a = {.a =0};  

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

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

有任务。

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2023-04-01
    • 2016-02-22
    • 2010-09-18
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2020-11-17
    相关资源
    最近更新 更多