使用{}初始化C中的结构

使用{}初始化C中的结构,c,struct,initialization,C,Struct,Initialization,在标记行中,我得到一个错误error-expected表达式 #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 {

在标记行中,我得到一个错误
error-expected表达式

#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;
}

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

只有在定义变量时才允许初始化。所以,不能在赋值中使用初始值设定项。 您可以改为使用C99:


即使您可以为此使用复合文字,也没有理由这样做。而是使用可读性最高的表单,即两行:
p->blocked_list.node.next=&p->blocked_list.node;p->blocked_list.node.prev=&p->blocked_list.node这是最清晰的形式,因此是首选的形式。请注意,通过执行
(struct list_head){..}
定义的复合文字将一直存在,直到离开当前范围为止。要在赋值后立即释放它,只需将整个赋值语句包装到一个新范围中,方法是将其括在大括号中
{…}
p->blocked_list.node.next = &(p->blocked_list.node);
p->blocked_list.node.prev = &(p->blocked_list.node);
p->blocked_list.node = (struct list_head) {&(p->blocked_list.node), &(p->blocked_list.node)}; //error