如何在C中使用带嵌套结构的指定init?

时间:2017-07-03 14:52:37

标签: c struct initialization

我正在尝试创建一个指向同一类型的另一个Node的Node结构。

我的结构看起来像这样:

typedef struct Node {
    int value;
    struct Node *next;
} Node;

我可以使用普通的malloc初始化它并分配结构的属性,如下所示:

Node *top = malloc(sizeof(Node));
top->value = 1;
top->next = NULL;

但如果我尝试使用带结构的指定init,它就会失败。

Node *next = {.value = 2, .next = {NULL, NULL}}; // warning: excess elements in scalar initializer

我也累了:

Node *next = {2, NULL}; // incompatible integer to pointer conversion initializing 'Node *'
Node *next = {NULL, 2}; // excess elements in scalar initializer

唯一可行的init就是将其全部分配为零

Node *next = {0}; // no error

编译我正在使用以下命令

gcc -Wall foo.c -o foo

2 个答案:

答案 0 :(得分:1)

您可以静态地构建一个列表:

Node node2 = { .value = 2, .next = NULL };
Node node1 = { .value = 1, .next = &node2 };
Node *first = &node1;

如果为节点使用自动存储类,请确保在到达封闭块结束后永远不要使用它们,因为它们将不再有效。

答案 1 :(得分:0)

分配内存后,您可以使用复合文字来设置字段:

Node *p = malloc(sizeof(Node));
if (!p) {
    perror("malloc failed");
    exit(1);
}
*p = (Node){ .value = 1, .next = NULL };