возврат ссылки из локальной (внутри функции) переменной из функции обратно в вызывающую - PullRequest
1 голос
/ 28 сентября 2011

my Q очень похож на них, но не совсем так:

Возвращение константной ссылки на локальную переменную из функции

Возвращение локальной функции-функции в качестве ссылки

У меня есть немного кода, который используется для анализа XML-файла. в основном происходит то, что локальная переменная передается по ссылке OUT функции с помощью оператора return. Чтобы быть более точным:

ezxml_t ezxml_parse_fd(int fd){

ezxml_root_t root;
//DO STUFF
return &root->xml;
}

вызывающий абонент

ezxml_t xml = ezxml_parse_fd(fd);

Ну, эта штука компилируется и работает (gcc) ... но я всегда знал, что локальные переменные уничтожаются, когда их область больше не существует ... я в замешательстве

Ответы [ 4 ]

2 голосов
/ 28 сентября 2011

Локальная переменная не"передана по ссылке", потому что это будет означать return &root;, а это не то, что говорит ваш код.

Скорее, возвращается указатель на некоторую другую, не связанную переменную, которую вы не хотели нам показывать, и мы должны предположить, что код был написан правильно, так что указатель указывает на некоторую динамически распределенную память, которая останется действительный.

1 голос
/ 28 сентября 2011

Как только функция возвращается, стек функций разматывается и ссылки на локальные переменные функции недопустимы.Пока вы можете сойти с рук, но не полагайтесь на это!
Почему бы не передать выходной параметр в функцию для сохранения значения?Возможно, в этих строках:

void ezxml_parse_fd(int fd, ezxml_t *parse_value) 
{

ezxml_root_t root;
//DO STUFF
*parse_value = &root->xml;
return;
}

...

ezxml_t xml;
ezxml_parse_fd(fd, &xml);

Если вы используете gcc, есть большая вероятность, что вы могли увидеть предупреждение "warning: функция возвращает адрес локальной переменной" Пожалуйста, обратите внимание на предупреждение компилятора!Он только пытается помочь вам (в большинстве случаев):)
Надеюсь, это поможет!

0 голосов
/ 28 сентября 2011

В Си - это, наверное, очень неправильно.Пожалуйста, сообщите нам, что такое ezxml_t и что такое root-> xml.

Я предполагаю, что ezxml_t автоматически приводится к указателю root-> xml, который вы возвращаете.

0 голосов
/ 28 сентября 2011

Да, локальные переменные уже уничтожены, но ваша ссылка указывает на место в памяти, которое содержит последнее присвоенное значение. Место, где была размещена ваша переменная. И это будет работать в большинстве случаев в однопоточной среде для простых типов. Но когда вы размещаете в стеке некоторый объект с деструктором, деструктор будет вызван именно тогда, когда выполнение блока (в вашем случае - функции) будет закончено. Поэтому вне функции у вас есть ссылка на уничтоженный объект. Коротко: не делай этого: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...