2014-10-11 198 views
2

我试图写一个使用指针链表使用指针的指针

我的代码是的头指针弹出从链表节点的弹出功能:

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的分段错误,发生了什么问题?有没有更好的方法来做到这一点?

我用指针的指针移动方法因为,我读指针是按值传递,因此,即使我使用临时变量局部的变化不会影响实际的一个

+1

您是否缺少代码中的typedef struct stack s;'?如果不是,那么's'的类型是什么?这种缩写类型名称很少适用。 – 2014-10-11 19:54:29

+0

@JonathanLeffler对不起,我忘了添加typedef struct stack s;我会编辑谢谢告诉 – sarat 2014-10-12 04:49:20

回答

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

3

在这这里流行改变的东西:

s **temp1; 
*temp1=NULL; 

因为Temp1没有初始化,所以temp1指向任何地方,但是您将NULL写入指向的位置。