2015-03-15 2 views
-4

Я есть эта функцияНевозможно изменить переменную указатель, передаваемый в качестве аргумента функции

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

Изменение подписи функции 'Int rt_exist (структура route_entry * & prev_rte) {', вы изменяете копию этого указателя локальной только функции. –

+5

Этот код C или код C++? Ответы совершенно разные для двух разных языков. –

+0

Возможно, вам сначала нужно узнать о конструкциях элементарного языка (таких как вызовы функций и типы аргументов), прежде чем писать программы ... – Walter

ответ

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; 

} 
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; 
} 
Смежные вопросы