【问题标题】:Initialize a struct in C using {}使用 {} 在 C 中初始化结构
【发布时间】:2016-10-14 08:16:30
【问题描述】:

在标记的行中我收到错误Error - expected expression

#include <stdlib.h>

struct list_head {
    struct list_head *next, *prev;
};

struct program_struct {
    const char *name;
    struct list_head node;
};
typedef struct program_struct program_t;

struct task_t {
    program_t blocked_list;
};

int main() {

    struct task_t *p = malloc(sizeof(*p));
    p->blocked_list.name = NULL;
    p->blocked_list.node = {&(p->blocked_list.node), &(p->blocked_list.node)}; //error

    return 0;
}

我知道我可以用

替换这一行
p->blocked_list.node.next = &(p->blocked_list.node);
p->blocked_list.node.prev = &(p->blocked_list.node);

但是我可以像我在第一段代码中尝试的那样使用{} 让它工作吗?

【问题讨论】:

  • 即使您可以为此使用复合文字,没有理由这样做。而是使用最易读的形式,即两行:p-&gt;blocked_list.node.next = &amp;p-&gt;blocked_list.node; p-&gt;blocked_list.node.prev = &amp;p-&gt;blocked_list.node; 这是最清晰的形式,因此是首选。

标签: c struct initialization


【解决方案1】:

只有在定义变量时才允许初始化。所以,你不能在赋值中使用初始化器。 你可以改用 C99 的compound literals:

p->blocked_list.node = (struct list_head) {&(p->blocked_list.node), &(p->blocked_list.node)}; //error

【讨论】:

  • 请注意,通过 (struct list_head) {..} 定义的复合文字会一直存在,直到离开当前范围。要在赋值后立即释放它,只需将整个赋值语句括在大括号 {...} 中,将其包装到一个新范围内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
相关资源
最近更新 更多