大家好我现在在C中实现动态大小的堆栈,但遇到了问题...这是我的代码的一部分:
#include <stdio.h>
#include <conio.h>
typedef struct Node node;
struct Node{
int value;
node *above;
};
struct stack{
node *root;
node *top;
};
typedef struct stack stack;
void stack_init(stack *s){
s = (stack*) malloc(sizeof(stack));
s->top=-1;
s->root=-1;
printf("%d %d\n", s->top, s->root);
};
int main(){
stack s;
stack_init(&s);
printf("%d %d\n", s.top, s.root);
}
当我运行代码时,来自stack_init的printf给出-1 -1而来自main的那个给出70 8,而在我的假设中它们应该是相同的。问题是什么?任何帮助表示赞赏!
答案 0 :(得分:2)
传递给函数时,您正在更改指针值。
void stack_init(stack *s){
s = (stack*) malloc(sizeof(stack));
这不起作用,因为您将其分配给函数s
上下文中的指针stack_init
。它对从main
传递的指针没有影响。 C是按值传递的。因此,指针的值(地址出现在s
中)是main
中可修复的地址,当您将s
分配给它被分配到不同地址的内容时,不会影响main
函数中的堆栈变量。
所以你需要一个双指针。
void stack_init(stack **s){
*s = (stack*) malloc(sizeof(stack));
(*s)->top=-1;
(*s)->root=-1;
printf("%d %d\n", (*s)->top, (*s)->root);
};
int main(){
stack *s;
stack_init(&s);
printf("%d %d\n", s->top, s->root);
}
或者您可以从stack_init函数返回一个指针并将其返回,以便您可以将其指定给堆栈指针。或者您可以在main函数中分配内存并将变量传递给函数以初始化值。
有很多方法可以做到,这取决于你的用例。我已经给出了以某种方式完成它的代码。
答案 1 :(得分:0)
malloc
,在这里您使用s
覆盖内存中另外一个位置malloc
的值并更新该位置的值并在该函数中打印本地这个功能。return
。typecasting
用于更新Node的值。您正在为结构分配整数值,同时在打印时,格式说明符也不适合打印值。以下是修改后的代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Node node;
struct Node{
int value;
node *above;
};
struct stack{
node *root;
node *top;
};
typedef struct stack stack;
void stack_init(stack *s){
// s = (stack*) malloc(sizeof(stack));
s->top=(node*)-1;
s->root=(node*)-1;
printf(" loop %d %d\n", s->top, s->root);
};
int main(){
stack s;
stack_init(&s);
printf("%d %d\n", s.top, s.root);
return 0;
}