gpt4 book ai didi

无法使用引用传递更改结构中的值

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:39 25 4
gpt4 key购买 nike

大家好,我现在正在用 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 中的 printf 给出 70 8,而在我看来它们应该是相同的。问题是什么?感谢您的帮助!

最佳答案

传递给函数时,您正在更改指针值。

void stack_init(stack *s){
s = (stack*) malloc(sizeof(stack));

这是行不通的,因为您将其分配给函数 stack_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 函数返回一个指针并返回它,以便您可以将其分配给您的堆栈指针。或者您可以在主函数中分配内存并将变量传递给函数以初始化值。

有很多方法可以做到这一点,这取决于您的用例。我已经给出了以一种方式执行此操作的代码。

关于无法使用引用传递更改结构中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33981806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com