2

所以我正在尝试实现一个链表,并且每个节点都有这个结构:

    typedef struct listNode {
        struct listNode *next;
        void *data;
    } NODE;

以前,我制作了一个游戏,其中航天器结构如下所示:

   typedef struct {
       int height;
       int width;
   } SPACECRAFT;

我可以做一个新的宇宙飞船

  SPACECRAFT plyrShip = {
      .width = //someInt;
      .height = //someInt;
  };

虽然使用节点,但变量是指针,它不允许我通过这样做来创建新节点

  NODE newNode = {
      .*next = null;
      .*data = *data //function has *data as parameter so I can pass it 
                     //into the node
  }

我究竟做错了什么?

4

2 回答 2

2

您已将指针声明语法和指定的初始化程序语法混为一谈。成员字段可以声明为指针类型。当使用指定的初始化器时,只需命名该字段。另请注意,它们是逗号分隔的。

  NODE newNode = {
      .next = null,
      .data = data
  };
于 2017-11-17T18:49:12.747 回答
2

正式地,这被称为自 C99 以来引入的指定初始化器。

首先,您应该实现指针类型。struct listNode next;是声明一个变量,next,其类型为struct listNodestruct listNode *next是声明一个变量 ,next其类型确实是指向类型为 的值的类型struct listNode。所以你应该这样做。

  NODE newNode = {
  .next = null,
  .data = data
  }

而且,这就是内存中的结构。您可以记住这一点以消除混乱。这清楚地指出了为什么你不能这样做。(由于此处的结构布局,结构中的 next 成员不能单独取消引用)。

|--------------|
| newNode.next | &newNode
|--------------|
| newNode.data |
|--------------|

更新的响应:检查编辑摘要。

于 2017-11-17T19:16:14.380 回答