2016-06-05 3 views
-2

Это код, который у меня есть вопрос о:Области применения и указатели

int* getPtrToFive() { 
    int x = 5; 
    return &x; 
} 
int main() { 
    int *p = getPtrToFive(); 
    cout << *p << endl; // ??? 
} 

Лекционные слайды говорят, что * р не даст правильный результат, потому что, как возвращается getPtrToFive х выходит из области видимости. Однако я думал, что getPtrToFive уже будет содержать значение 5, которое будет проверять * p? Это из-за указателя, пытающегося направить меня на getPtrToFive, который имеет вне области x?

ответ

0

Да, вы правы.

Даже если выход каким-то образом 5, это незаконно для доступа к памяти, которая была недоступна.

3

Вы, кажется, не понимаете основную концепцию указателя. Подумайте об этом как о адресе дома. 1 Main St - ваш указатель. Но что происходит, если дом разрушен? Кто-то проедет весь путь до 1 Main St, только чтобы найти там кучу обломков ... Конечно, это не хороший результат.

Итак, когда функция выйдет, дом будет уничтожен. У вас все еще есть адрес, но ничего не осталось.

+0

Nice аналогичный пример. –

+0

Я думаю, что я все еще не понимаю, потому что это противоречит ответу на другой вопрос. http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope Другой вопрос показал, что, хотя кто-то набирал код в том же формате, они все еще могли получить результат от cout. Прямо сейчас, в лекции говорится, что вы не получите никакого результата, как и вы. – blueyfooey

+0

@blueyfooey, оба ответа имеют одинаковую идею. (Тот, с которым вы связаны, на самом деле лучше, чем у меня). Вы можете получить случайный результат. Случайный результат - это просто случайный. Может получиться 5, может получиться 42, может произойти сбой программы (вариант случайного результата) или что-нибудь еще. – SergeyA

Смежные вопросы