如何更改结构中的指针变量?

时间:2017-11-17 18:31:09

标签: c pointers struct designated-initializer

所以我试图实现一个链表,我为每个节点都有这个结构:

    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
  }

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

正式地说,这被称为Designated Initializer,这是自C99以来引入的。

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

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

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

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

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