我必须在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文件中,我这样定义了堆栈和初始化函数
struct _my_stack{
void* data;
struct _my_stack* next;
};
my_stack_t* my_stack_new(){
my_stack_t* mystack = NULL;
return mystack;
};
然后我定义了如下的push函数:
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;
};
但是,推送似乎不起作用,尝试访问所推送元素的数据时出现分段错误。 那么为什么它不起作用。 在推送中,它为堆栈项分配了空间,并将指向数据的指针放在data变量中。然后将指针指向堆栈的当前头,并将其放在下一个var中,然后使堆栈头指向当前元素。
注意:.h文件已给定,因此我必须接受在此处声明的函数。
答案 0 :(得分:2)
问题是在s
内对my_stack_push
进行的更改不会更改调用my_stack_push
时用作参数的变量的值。
如果您的代码是:
int main()
{
...
my_stack_t* s = my_stack_new();
my_stack_push(s, some_data_pointer);
...
}
然后,s
中的main
是与s
内部的my_stack_push
不同的变量。他们唯一的关系是s
中的my_stack_push
被初始化为s
中main
值的副本。
因此-更改s
中my_stack_push
的值不会不更改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 &
答案 1 :(得分:1)
但是,推送似乎不起作用,尝试访问所推送元素的数据时出现分段错误。那为什么不起作用
您可能会做类似的事情:
my_stack_t* mystack;
my_stack_push(mystack, ..adata..);
假设 mystack 由my_stack_push
修改,情况并非如此,因为在my_stack_push
中,s=mystack;
形式只需修改 local 变量
您可以通过两种方式进行更改
1)在参数中给出var的地址,而不是其值
my_stack_t* mystack = NULL;
my_stack_push(&mystack, ..adata..);
当然
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;
};
2)返回新单元格
my_stack_t* mystack = NULL;
mystack = my_stack_push(mystack, ..adata..);
当然
my_stack_t * 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;
return mystack;
};