Возврат адреса локального поведения переменных

Возможный дубликат:
Можно ли получить доступ к памяти локальной переменной за пределами ее объема?

вход:

#include  #include  int func2(void); int* func1(void); int func2(void) { int* b; b = func1(); printf("%d", *b); printf("%d", *b); printf("%d", *b); } int* func1() { int a = 13; return &a; } int main() { func2(); } 

Выход:

 13 -1077824828 -1077824828 

Может ли кто-нибудь объяснить, что произошло в стеке и ОС? Почему результат изменился с 13 на мусор после получения значения указателя?

    Конечно. Результат будет отличаться от отладки и выпуска (чистый). Локальная переменная – EBP- (некоторое смещение), если вы посмотрите на сборку. Это означает, ВЫШЕ В СТЕКЕ, как в «дальнейшем».

    Это адрес, который вы возвращаете.

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

    Вызов printf создает новый стек стека, который перезаписывает местоположение, ранее занятое a .