我试图编写一个pop函数,它通过使用指向链表头指针的指针从链表中弹出一个节点
我的代码是:
struct stack{
char name;
int info;
struct stack *next;
};
typedef struct stack s;
我写的第一个POP函数是(这是我第一次使用指针指针)
1) s *pop(s **ps){
s **temp1;
*temp1=NULL;
*temp1=*ps;
*ps=(*ps)->next;
return *temp1;
}
相当有效
2) s *pop(s **ps){
s *temp2=NULL;
temp2=*ps;
*ps=(*ps)->next;
return temp2;
}
我得到1的分段错误,哪里出错了?,有更好的方法吗?
我使用指针指针方法cos我已经读取指针通过值传递所以即使我使用temp变量更改pop中的某些内容,本地更改也不会影响实际的
答案 0 :(得分:3)
在这里:
s **temp1;
*temp1=NULL;
temp1指向任何地方,因为它未初始化,但你将NULL
写到指向的地方。
答案 1 :(得分:3)
为了简化问题,让我们来说明使用整数和整数指针而不是指针和指针指针:
第一个片段:
int pop(int *ps){
int *temp1;
*temp1=0;
*temp1=*ps;
*ps=*ps + 1;
return *temp1;
}
第二片段:
int pop(int *ps){
int temp1;
temp1=0;
temp1=*ps;
*ps=*ps + 1;
return temp1;
}
在您的第一个代码片段中,您正在取消引用未初始化的指针。当您尝试访问*temp1
时,您将收到访问冲突,因为temp1
未初始化并且可能指向NULL或其他一些无效指针。在第二个片段中,我们没有解除引用它,只分配给编译器分配给temp1
的内存位置。
ps
是指向指针(或图中指向整数的指针)的原因是因为我们想要在函数外部更改其值。无论谁调用pop函数都会告诉我们pop应该在什么位置写入新值。我们没有直接访问该变量,因此调用者需要传递指向它的指针。但是,在pop函数中,我们不需要使用指针指针,因为我们的局部变量是可访问的。