通过C

时间:2017-07-16 04:27:15

标签: c

我想通过引用传递一个节点,并希望函数更新main()中的变量

struct stack
{
    int item;
    struct stack *link;
};

void push(int item, struct stack *top)
{
  /* allocate memory and insert item*/  
}

int main(void)
{
    struct stack *top;
    push(10,top);
    printf("%d\n",top->item);
    return 0;
}

此处显示“细分错误”,好像top根本没有更新!

2 个答案:

答案 0 :(得分:2)

您需要通过引用函数topmain()中传递指针push()。因此,请提供top的地址,而不是其值。

所以使用

push(10,&top);

而不是

push(10,top);

如果对top中的push()所做的更改将反映在main()中。

这需要修改功能原型。使用

void push(int item,struct stack **top)

而不是

void push(int item,struct stack *top)

*top中使用top的地方使用push()

答案 1 :(得分:1)

您需要做两个选项,具体取决于您的函数是分配堆栈还是SELECT * FROM LEASE L WHERE NOT EXISTS (SELECT * FROM AVAILABILITY A WHERE A.UNIT_KEY = L.UNIT_KEY AND A.AVAILABILITY = 1 AND A.START_DATE <= L.LEASE_START AND A.END_DATE >= L.LEASE_END); 函数分配堆栈元素。

选项1 - main()分配main()

top

这在堆栈的上下文中并不是特别好用,但通常可以是处理结构的正确方法 - 调用代码分配结构,被调用的代码使用分配的结构。这是调用代码中的动态分配,传递给要初始化的函数:

void push(int item, struct stack *top)
{
    top->link = 0;
    top->item = item;  
}

int main(void)
{
    struct stack top;    // Plain structure, not a pointer
    push(10, &top);      // Pass address of structure to function
    printf("%d\n", top.item);
    return 0;
}

选项2 - int main(void) { struct stack *top = malloc(sizeof(*top)); if (top != 0) { push(10, top); printf("%d\n", top->item); free(top); } return 0; } 分配push()

top

这段代码很奇怪,因为它使用的是固定操作而不是循环,但在其他方面是犹太的。使用void push(int item, struct stack **top) { struct stack *node = malloc(sizeof(*node)); node->link = *top; node->item = item; *top = node; } int main(void) { struct stack *top = 0; // Initialization is crucial push(10, &top); printf("%d\n", top->item); push(20, &top); printf("%d %d\n", top->item, top->link->item); free(top->link); free(top); return 0; } 显示的所有代码都已经过Valgrind测试,并获得了健康的清单。