指针指针的用法

时间:2014-10-11 19:27:30

标签: c pointers

我试图编写一个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中的某些内容,本地更改也不会影响实际的

2 个答案:

答案 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函数中,我们不需要使用指针指针,因为我们的局部变量是可访问的。