对于以下功能:
/*this function removes the topmost item in the stack*/
void pop(Stack * S, NODE * returnNode) {
stackNode * temp;
if(S->root == NULL) {
ERROR("Sorry, cannot pop an empty stack!!\n");
}
else {
temp = S->root;
returnNode = temp->Item;/*x now points to the topmost node*/
S->root = temp->nextItem;/*stack points to the rest of the list*/
free(temp);/*returning memory to the system*/
}
}
我希望returnNode
指针与temp->Item
具有相同的值,但是当我检查GDB
中的值时,它不会。我错过了什么吗?
我应该补充一点,temp
值正确设置。
答案 0 :(得分:2)
如果要将指针更新为参数,则需要传递它的地址。否则,您只是更新调用堆栈上的值,该值在本地范围内。
void pop(Stack * S, NODE ** returnNode) {
stackNode * temp;
if(S->root == NULL) {
ERROR("Sorry, cannot pop an empty stack!!\n");
}
else {
temp = S->root;
*returnNode = temp->Item;/*x now points to the topmost node*/
S->root = temp->nextItem;/*stack points to the rest of the list*/
free(temp);/*returning memory to the system*/
}
}
答案 1 :(得分:1)
您应该*returnNode = temp->Item;
而不是returnNode = temp->Item;
。
答案 2 :(得分:1)
以这种方式思考,
在函数中,您只能修改指针指向的变量,而不是指针本身的值,即地址。如果要修改指针的值,则需要传递指向它的指针。
例如
如果你有:
int k = 5, f = 15, *pk = &k, *pf = &f;
你要切换pk和pf的值,你需要这样的函数:
void change (int **m, int **n) {
int *help = *m;
*m = *n;
*n = help;
}
change(&pk, &pf);
printf("pk ist %i, pf ist %i\n", *pk, *pf);
/* pk ist 15, pf ist 5;*/