2015-08-25 7 views
-4
int * foo() 
{ 
    int b=8; 
    int * temp=&b; 
    return temp; 
} 

У меня есть несколько вопросов,Возврат по адресу

  1. В какой части макета памяти делает * р подарок.
  2. Я копирую локальный адрес переменной в указатель temp без выделения памяти. Но даже тогда он сохраняет адрес локальной переменной, как это возможно?
  3. Программа отлично работает для меня, когда я разыгрываю ее (локальная переменная определенно не будет там), почему я получаю значение по-прежнему.

Действительно ничего не понимает. Может кто-нибудь объяснить все мои вышеперечисленные вопросы в деталях.

+0

Вы по-прежнему возвращаете указатель на локальную переменную 'b', которая ведет к блуждающему указателю и, вероятно, неопределенному поведению. –

+2

Что такое * p? И можете ли вы опубликовать весь свой код здесь? –

ответ

3

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

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

+0

Похоже, что кто-то пошел и подал два ответа. –

+0

@ TheParamagneticCroissant Да что-то странное – Gopi

+0

«_Введение адреса локальной переменной приводит к неопределенному поведению.» - Не должно быть что-то вроде «_Введение адреса локальной переменной и использование ее в другой функции приводит к неопределенному поведению ._ "? –

3

В какой части макета памяти есть * p.

В вашей программе нет p.

Я копирую локальный адрес переменной в указатель temp без выделения памяти. Но даже тогда он сохраняет адрес локальной переменной, как это возможно?

Локальная переменная имеет адрес. Вы можете вернуть этот адрес.

Программа отлично подходит для меня, когда я разыгрываю ее (локальная переменная определенно не будет там), почему я получаю значение по-прежнему.

Код с ошибками делает странные вещи, которых вы не ожидаете. Исправьте ошибку, и тайна исчезнет.