指针指针:引用成员时出错

时间:2016-08-10 18:55:50

标签: c pointers memory-leaks

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

#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

我无法理解我到底出错的地方。

2 个答案:

答案 0 :(得分:3)

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

*(root)->data = 5;

相当于:

*(root->data) = 5;

你打算做的是:

(*root)->data = 5;

下一行相同,应为:

(*root)->next = temp;

另请注意,malloc.h不可移植。您应该包含C标准标题stdlib.h>,以获取malloc()的原型。

答案 1 :(得分:1)

->运算符的优先级高于解除引用运算符*。有关完整列表,请参阅here。 所以像

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

将是非法的,因为首先它试图在data指向的某个地方找到一个字段root,显然无法找到它,因为它也是指针类型。

相反,您应该使用显式优先级:

(*root)->data = 5;