我必须在 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
中的 s
与 my_stack_push
中的 s
是不同的变量。它们唯一的关系是 my_stack_push
中的 s
是 用 s
中的值的副本初始化 主要
。
因此 - 更改 my_stack_push
中 s
的值不会更改 中
。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/