【问题标题】:Pointers to pointers : error in referencing members指向指针的指针:引用成员时出错
【发布时间】:2016-08-10 18:55:50
【问题描述】:

下面是一个简单的代码,我尝试使用指向指针的指针将节点添加到链表中。

#include <stdio.h>
#include <malloc.h>

struct node 
{
        int data;
        struct node *next;
};

void insert(struct node **root)
{
    struct node * temp = (struct node *)malloc(sizeof(struct node));
    if(*root == NULL)
    {
       *(root) = (struct node *) malloc (sizeof(struct node ));
       *(root)->data = 5;
       *(root)->next = temp;
    }
    else
        printf("here");
}

int main()
{
  struct node *root = NULL;
  insert(&root);
  return 0;
}

我的理解是,在 main() 中,一个块被分配给 root。在insert 中,该内存块的地址在参数中传递。然后它检查它们是否是分配给该地址的结构的任何内存块,如果它是 NULL 内存则分配给结构块。这应该被*root引用。但是当我执行上面的代码时,我得到了以下错误:

error: request for member 'data' in something not a structure or union

我无法理解我到底哪里出错了。

【问题讨论】:

  • *(root)-&gt;data = 5; -->> (*root)-&gt;data = 5; BTW:您的代码在某些代码路径上泄漏了 *temp 内存。并且:移除石膏,它们只会造成伤害。
  • 成功了!谢谢@wildplasser。您能否简要解释一下这两种情况下的优先级有何不同。
  • 其他人已经这样做了。 -&gt;. 具有最高优先级(“绑定更紧”); *较弱。而#include &lt;malloc.h&gt; malloc.h 是一个非标准的标头。你想要stdlib.h
  • malloc 使用正确的标头,即&lt;stdlib.h&gt;
  • 我已将您的问题编辑为引用“指向指针的指针”而不是“双指针”。 “双指针”可以是 double* 类型。

标签: c pointers memory-leaks


【解决方案1】:

-&gt; 比解引用运算符 (*) 绑定得更紧密。见operator precedence。所以,

*(root)->data = 5;

相当于:

*(root->data) = 5;

你打算做的是:

(*root)->data = 5;

下一行也一样,应该是:

(*root)->next = temp;

另外,请注意malloc.h 不可移植。您应该包含 C 标准头文件 stdlib.h&gt; 来获取 malloc() 的原型。

【讨论】:

    【解决方案2】:

    -&gt; 运算符的优先级高于取消引用运算符 *。有关完整列表,请参阅 here。 所以像

    这样的行
    *(root)->data = 5;
    

    将是非法的,因为首先它试图在root 指向的东西中找到一个字段data,但显然没有找到它,因为它也是一个指针类型.

    您应该使用显式优先级:

    (*root)->data = 5;
    

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 2018-03-24
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      相关资源
      最近更新 更多