我想通过引用传递一个节点,并希望函数更新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
根本没有更新!
答案 0 :(得分:2)
您需要通过引用函数top
在main()
中传递指针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);
函数分配堆栈元素。
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;
}
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测试,并获得了健康的清单。