我有一个关于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。
答案 0 :(得分:1)
arr[value]=&p
实际上是返回一个指向局部变量的指针,这永远不是一个有效的事情。函数返回后,本地变量不存在。看起来您想要的是将参数声明为node *arr[]
并将该行更改为arr[value]=p
。这将正确保存指向您为节点分配的内存的指针。
您可能还想考虑让函数分配和初始化node
结构并返回它是否更有意义,此时调用者可以将其添加到数组中。
答案 1 :(得分:0)
在你的例子中,你没有添加节点的指针,但是你正在为节点添加一个pointeur。 节点的pointeur是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;
};
我希望我已经回答了你的问题