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

大家好,我现在正在用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);
}
#包括
#包括
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
    的值,并更新该位置的值,同时在该函数本地的函数中打印
  • 主要是打印函数堆栈_init中未以任何方式修改的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中不能通过引用传递。