【问题标题】:How to change pointer variables within a struct?如何更改结构中的指针变量?
【发布时间】:2017-11-17 18:31:09
【问题描述】:

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

    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
  }

我做错了什么?

【问题讨论】:

  • *type 的一部分,而不是字段名的一部分,因此您只需初始化 .next,而不是 .*next。诚然,struct node *next 的语法在这方面令人困惑,事实上,许多人更喜欢写成 struct node* next,以明确这一点。
  • 那么在这种情况下,我设置的 .next 值应该是列表中下一个节点的内存地址?还是节点本身?
  • 我还想指出,当您设置 newNode.data 时,您可能不应该取消引用 data。如果data 是一个指针,那么传入该指针可能就是你想要的。
  • @Ctx 我不同意,struct node* next, prev; 实际上更令人困惑,因为如果* 属于该类型,那么prev 的类型是什么?
  • @IharobAlAsimi 哦,我们玩琐事? ;) prev 的类型是struct node

标签: c pointers struct designated-initializer


【解决方案1】:

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

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

【讨论】:

  • 那么如果我想使用 malloc 在堆上为其分配内存,我应该怎么做?
  • node *newNode = (node*) malloc(sizeof(newNode)); ?
  • node *newNode = malloc(sizeof(*newNode));
  • 据我了解,如果 malloc 无法分配此内存,则它会返回 null,尽管我不确定如果它工作它应该返回什么,因为它会自动将其设置为类型* void 因此我尝试投射它。
  • 如果malloc 返回NULL,则newNode 变为NULL。测试newNode == NULL 以确定malloc 是否成功。在大多数情况下,铸造通常被认为是不正确的工具(有一些例外)。在转换malloc 的特殊情况下,它可以隐藏原型丢失的事实,并导致未定义的行为,这在指针比int 宽的平台上尤其糟糕。 Don't cast malloc.
【解决方案2】:

官方称为Designated Initializer,自 C99 开始引入。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多