Вернуться с амперсандом

Мне пришлось возвращать указатель структурного объекта в функции, но я не сохранял их как указатели, поэтому я использовал return &myStructObject; возвращать. Это не дает никакой ошибки во время компиляции, но то, что я пытаюсь сделать, является правильным?

0

Решение

Если объект структуры, на который вы ссылаетесь, является локальным для функции, то вы не должны возвращать адрес этого объекта структуры. Это потому, что когда ваша функция возвращает вызов вызывающей стороне, все локальные переменные уничтожаются из памяти.

Например: —

Ниже приведена фатальная ошибка

int* myFunc ()
{
int p = 4;            // memory is allocated for p.
// do something.
return &p;            // memory for p is deallocated and you are returning pointer to that memory
}
0

Другие решения

Если переменная структуры, указатель которой вы хотите вернуть, все еще находится в области видимости после возврата из функции, то, что вы делаете, является правильным.

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

РЕДАКТИРОВАТЬ:

«Не будет служить вашей цели», я имею в виду, что он не будет делать то, что вы думаете, что он будет! Нет смысла обсуждать, какой вред это может принести, если вы уверены, что оно не делает того, чего вы ожидаете!

0

Если у вас есть что-то локальное в функции и вы возвращаете ей адрес, оно будет потеряно, то есть обнулено. Причина заключается в том, что функция, из которой вы возвращаете адрес, будет POPped из стека, а все нестатические (неглобальные) будут потеряны. По сути, все, что память программы не имеет как «пожизненный» ресурс, исчезнет. Вы можете передать указатели в качестве аргумента функции и разыменовать ее, чтобы изменить значение, указанное указателем. Но все, что не является статичным (или не является глобальным) и возвращается в качестве адреса, приведет к доступу к ошибкам типа нарушения.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector