有关参考号码的问题?

时间:2010-02-15 13:50:34

标签: c++ pass-by-reference argument-passing

main()使用参数First Node调用Call_By_Test()函数。 我已经释放了Call_By_Test()中的第一个节点,但第一个节点地址没有在main()中释放,为什么?。

typedef struct LinkList{
int data;
struct LinkList *next;
}mynode;

void Call_By_Test(mynode * first)
{
        free(first->next);
        first->next = (mynode *)NULL;
        free(first);
        first = (mynode *)NULL;
}
int main()
{
mynode *first;

first = (mynode *)malloc(sizeof(mynode));
first->data = 10;
first->next = (mynode *)NULL;

cout<<"\n first pointer value before free"<<first<<endl;

Call_By_Test(first);
// we freed first pointer in Call_By_Test(), it should be NULL
if(first != NULL)
        cout<< " I have freed first NODE in Call-By-Test(), but  why first node pointer has the value "<<first<<endl;


}

输出:  第一个指针值为0x804b008  我已经在Call-By-Test()中释放了第一个NODE,但为什么第一个节点指针的值为0x804b008

5 个答案:

答案 0 :(得分:7)

答案是你没有使用传递引用。你是按值传递一个指针 - 这不是一回事。这意味着您将看到指针引用的数据中的更改,但在Call_By_Test方法中更改first本身的值不会执行任何操作。

答案 1 :(得分:5)

由于问题标记为c ++,我会重构为:

void Call_By_Test( mynode *& first ) // rest of code remains the same

传达了传递参考而没有额外的解引用。建议将指针传递给指针(void Call_By_Test( mynode ** first ))的所有解决方案都在指向指针变量的指针中使用按值传递语义。虽然您可以在C ++中执行此操作,但传递引用更清晰。

答案 2 :(得分:3)

在功能

void Call_By_Test(mynode * first)

首先实际上是函数的局部变量。更改它不会改变程序其余部分的状态。您需要对指针或指针指针的引用:

void Call_By_Test(mynode ** first)
{
        free((*first)->next);
        (*first)->next = NULL;
        free(*first);
        *first = NULL;
}

并称之为:

Call_By_Test( & first );

答案 3 :(得分:1)

当你这样做时:

void Call_By_Test(mynode * first)

您先复制,这样您就可以处理首先找到的内容,但由于它是副本,因此您无法先更改地址。

如果你想先改变这个值,你应该有这样的函数:

void Call_By_Test(mynode ** first)

void Call_By_Test(mynode & first)

允许您首先访问参数,就好像它是原始变量(而不是主函数的副本)

答案 4 :(得分:0)

如果free指针(例如0x804b008),则不会改变指针本身的位。它只允许C ++库记录指向地址的内存不再被使用,并且可以被回收。在您的情况下,当您打印0x804b008时,地址0x804b008的内存可供C ++库重用。