c - c中的简单堆栈,带有链表和指针

标签 c pointers linked-list stack

我必须在 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;
};

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

注意:给出了 .h 文件,所以我必须获取在那里声明的函数。

最佳答案

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

如果您的代码是:

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

然后 main 中的 smy_stack_push 中的 s 是不同的变量。它们唯一的关系是 my_stack_push 中的 ss 中的值的副本初始化 主要

因此 - 更改 my_stack_pushs 的值不会更改 s 的值>主要

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

所以你想要的是:

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 &

关于c - c中的简单堆栈,带有链表和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54928262/

相关文章:

c - 在没有 malloc、brk 或 mmap 的情况下,BareMetalOS 如何在 Assembly 中分配内存?

c - a[n] 真的可以与 *(a+n) 互换吗 - 为什么 sizeof 返回两个不同的答案?

c++ - 指针增加有什么作用? (C/C++)

无法防止链表打印功能崩溃

c++ - 链表中的搜索函数 - C++

C 链表实现

c - 静态/动态库与 .so 库?

c - 是否可以在 C 中将 char[] 转换为 char*?

C:将 token 存储在不断增长的数组中

c - searchAndRemove C 中链表的元素