首页 > 解决方案 > 带有链表和指针的c中的简单堆栈

问题描述

我必须用 C 实现一个简单的堆栈,但是自从我用 C 写东西已经有几年了,所以有点生疏了。

我在 .h 文件中定义了一个这样的结构,typedef struct _my_stack my_stack_t; 以及一个初始化堆栈my_stack_t* my_stack_new();的函数和一个推送函数void my_stack_push(my_stack_t *s, void *data);

在 .c 文件中,我像这样定义了堆栈和 init 函数

struct _my_stack{
    void* data;
    struct _my_stack* next;
};
my_stack_t* my_stack_new(){
    my_stack_t* mystack = NULL;
    return mystack;
};

然后我定义了这样的推送功能:

void my_stack_push(my_stack_t *s, void *data){
    my_stack_t* mystack = (my_stack_t*)malloc(sizeof(my_stack_t));
    mystack->data = data;
    mystack->next = s;
    s=mystack;
};

但是推送似乎不起作用,是我在尝试访问我推送的元素的数据时遇到分段错误。那么为什么它不起作用。在推送中,它为堆栈项分配了空间,并将指向数据的指针放入数据变量中。它将指向当前堆栈头的指针放入下一个变量中,然后使堆栈头指向当前元素。

注意:.h 文件是给定的,所以我必须在函数中声明它们。

标签: cpointerslinked-liststack

解决方案


问题是对sinside的更改my_stack_push不会更改my_stack_push被调用时用作参数的变量的值。

如果您的代码是:

int main()
{
    ...
    my_stack_t* s = my_stack_new();
    my_stack_push(s, some_data_pointer);
    ...
}

那么sin是一个与insidemain不同的变量。他们唯一的关系是inside是用in的值的副本初始化的smy_stack_pushsmy_stack_pushsmain

因此,改变 inside 的值不会s改变my_stack_pushin的值。smain

要在函数外部更改变量,您需要向函数传递一个指向该变量的指针。

所以你想要的是:

void my_stack_push(my_stack_t **s, void *data){   // Notice the extra *
    my_stack_t* mystack = malloc(sizeof(my_stack_t));
    mystack->data = data;
    mystack->next = *s;   // Notice the extra *
    *s=mystack;           // Notice the extra *
};

并像这样使用它:

my_stack_t* s = my_stack_new();
my_stack_push(&s, some_data_pointer);  // Notice the &

推荐阅读