C 无法使用“按引用传递”更改结构中的值
大家好,我现在正在用C实现一个动态大小堆栈,但遇到了一个问题。。。这是我代码的一部分:C 无法使用“按引用传递”更改结构中的值,c,C,大家好,我现在正在用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; v
#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);
}
#包括
#包括
typedef结构节点;
结构节点{
int值;
节点*以上;
};
结构堆栈{
节点*根;
节点*顶部;
};
typedef结构堆栈;
无效堆栈_init(堆栈*s){
s=(堆栈*)malloc(sizeof(堆栈));
s->top=-1;
s->root=-1;
printf(“%d%d\n”,s->top,s->root);
};
int main(){
堆栈s;
堆栈初始化(&s);
printf(“%d%d\n”,s.top,s.root);
}
当我运行代码时,stack_init中的printf给出了-1-1,main中的printf给出了708,而在我的假设中,它们应该是相同的。有什么问题?感谢您的帮助 传递到函数时,您正在更改指针值
void stack_init(stack *s){
s = (stack*) malloc(sizeof(stack));
这不起作用,因为您正在将其分配给函数stack\u init
上下文中的指针s
。它对从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函数中分配内存,并将变量传递给函数以初始化值
有很多方法可以做到这一点,这取决于您的用例。我已经给出了用一种方法实现它的代码
malloc
有问题,这里您使用malloc
在内存中的一个位置覆盖s
的值,并更新该位置的值,同时在该函数本地的函数中打印返回
typecasting
。您正在为结构指定整数值,并且在打印时,格式说明符不适合打印值#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;
}
#包括
#包括
typedef结构节点;
结构节点{
int值;
节点*以上;
};
结构堆栈{
节点*根;
节点*顶部;
};
typedef结构堆栈;
无效堆栈_init(堆栈*s){
//s=(堆栈*)malloc(sizeof(堆栈));
s->top=(节点*)-1;
s->root=(节点*)-1;
printf(“循环%d%d\n”,s->top,s->root);
};
int main(){
堆栈s;
堆栈初始化(&s);
printf(“%d%d\n”,s.top,s.root);
返回0;
}
可能是因为您正在为指向的对象分配一个使用malloc
分配的内存位置,而不是用户传入的值。这是因为您没有修改传递到stack\u init
中的原始s
缓冲区,而是修改malloc
分配的新缓冲区。只需删除malloc
行,它就可以执行您想要的操作。注意:初始化指向-1
的指针不是一个好主意,因为这不是一个有效的指针值。使用NULL
。只需删除行s=(stack*)malloc(sizeof(stack))代码>您似乎不明白在C中不能通过引用传递。