2017-02-01 35 views
1

我对自己在C函数初学者的问题,说我有指针链表的数组,我想编写一个函数来一个节点的指针添加到阵列中:C:功能传球达阵输入

void addhash(int value,struct node ** arr[]){ 
    struct node *p =(struct node*)malloc(sizeof(struct node)); 
    p->value=10; 
    arr[value]=&p; 
}; 

这是定义函数的正确方法吗?当我在main中运行这个时,我尝试添加节点的存储桶仍然是NULL。

回答

1

arr[value]=&p正在有效地返回一个指向局部变量的指针,这永远不是一件有效的事情。函数返回后,局部变量不存在。它看起来像你想要声明的参数为node *arr[]并将该行更改为arr[value]=p。这将正确地保存指向您为节点分配的内存的指针。

您可能还需要考虑是否更有意义,具有的功能仅分配并初始化node结构和返回,此时调用者可以将其添加到阵列中。

+0

您好,感谢它帮助了很多的反馈! – woshidashen

+0

我用struct node ** hashtable [10000]定义了我的数组; – woshidashen

+0

所以我想我应该改为定义它像结构节点*哈希表[10000];并相应地重写我的功能,然后再次感谢! – woshidashen

0

在你的例子中,你并没有添加节点的指针,但是你正在向节点添加一个角色的角色。 如果你保存p的地址,那么节点的指针就是p,那么你就保存了指针的地址。我们有p是一个局部变量,所以当我们从函数返回时,它会错位。规则:永远不要试图保存局部变量的地址,并在声明该变量的函数之外使用它。

void addhash(int value,struct node * arr[]){ 
struct node *p =(struct node*)malloc(sizeof(struct node)); 
p->value=10; 
arr[value]=p; 
}; 

我希望我已经回答了你的问题

+0

你做到了!它非常感谢! – woshidashen