不能使用传递引用来更改struct中的值

时间:2015-11-29 10:36:55

标签: 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;

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,而在我的假设中它们应该是相同的。问题是什么?任何帮助表示赞赏!

2 个答案:

答案 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)

  1. 问题malloc,在这里您使用s覆盖内存中另外一个位置malloc的值并更新该位置的值并在该函数中打印本地这个功能。
  2. 在main中,您正在打印函数stack_init中未以任何方式修改的s的实际值。
  3. 次要警告主要功能中没有return
  4. 没有typecasting用于更新Node的值。您正在为结构分配整数值,同时在打印时,格式说明符也不适合打印值。
  5. 以下是修改后的代码

    #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;
    }