指针没有取得新的价值

时间:2015-02-07 20:45:00

标签: c pointers

对于以下功能:

/*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值正确设置。

3 个答案:

答案 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;*/