c - 带有链表和指针的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 文件是给定的,所以我必须在函数中声明它们。
解决方案
问题是对s
inside的更改my_stack_push
不会更改my_stack_push
被调用时用作参数的变量的值。
如果您的代码是:
int main()
{
...
my_stack_t* s = my_stack_new();
my_stack_push(s, some_data_pointer);
...
}
那么s
in是一个与insidemain
不同的变量。他们唯一的关系是inside是用in的值的副本初始化的。s
my_stack_push
s
my_stack_push
s
main
因此,改变 inside 的值不会s
改变my_stack_push
in的值。s
main
要在函数外部更改变量,您需要向函数传递一个指向该变量的指针。
所以你想要的是:
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 &
推荐阅读
- sql - 如何将查询结果转换为字符串并将其插入表行
- laravel - 无法更新 Laravel 数据库(模型、视图、控制器)
- reactjs - 反应路由器dom不渲染子组件但url改变了
- jquery - jquery删除(div)中的id
- docker - ip路由规则解读
- python - python - 正则表达式仅适用于单个单词
- firebase - 为了安全起见,我们应该在哪里保存 chrome 扩展中的 Api 配置?
- shell - 如何排列数据线
- database - Symfony 3 - CKEditor 没有正确保存在数据库中
- jquery - 如何使用 jquery 禁用 html 中的部分?