无法修改作为参数传递给函数的指针变量

时间:2015-03-15 12:10:41

标签: c pointers

我有这个功能

int rt_exist(struct route_entry* prev_rte) {

prev_rte = rte_head;   //This doen't assigns rte_head to prev_rte

return 0;

}

其中 rte_head 是初始化的struct route_entry *指针变量。 但在上述情况下,“prev_rte”未分配rte_head的值。

顺便说一下,如果我这样做的话,我就是

int rt_exist(struct route_entry* prev_rte) {

struct route_entry* rte_new;
rte_new = rte_head;      //But this can 

return 0;

}

以上分配顺利进行。当指针变量作为函数参数传递时会出现问题。

这是一个奇怪的问题,细节很少,但有人可能会指出我可能的方向或我可能做错的事情。

2 个答案:

答案 0 :(得分:8)

考虑一下:

void foo (int j)
{
    j = 7;
}

foo (8);

你期望在这里发生什么?函数不能以这种方式更改调用者中的值。

这里应该发生什么:

rt_exist (NULL);

对于C ++,您可以使用引用:

int rt_exist(struct route_entry*& prev_rte) {

prev_rte = rte_head;   //This doen't assigns rte_head to prev_rte

return 0;

}

对于C,您需要将指针传递给您想要更改的内容:

int rt_exist(struct route_entry** prev_rte_ptr) {

*prev_rte_ptr = rte_head;   //This doen't assigns rte_head to prev_rte

return 0;

}

答案 1 :(得分:2)

是的!在第一种情况下,您正在使用堆栈的临时部分。但在第二种情况下,您正在使用分配。这意味着您正在使用来自堆的一部分内存。这显然会影响价值。这就像新块中的新变量。在此范围内,它将具有指定的值。

但是在rt_exist中传递了变量的副本。因此,任何改变都不会影响实际的改变。但是你可以传递它的地址并像这样轻松地改变它。

int rt_exist(struct route_entry** prev_rte) 
{
*prev_rte = rte_head;   //This does assign rte_head to prev_rte.
return 0;
}