Как уже упоминалось другие, сохранение адреса локальной переменной, то пытается разыменования этот адрес после завершения функции является undefined behavior.
Что это значит, что ваша программа может потерпеть крах, она может проявить странное поведение или может показаться, что она работает правильно. Это поведение не обязательно должно быть последовательным от одного компилятора к следующему для того же кода или при наличии кажущегося несвязанного изменения.
При этом многие компиляторы обычно не будут изменять часть стека, используемую функцией после ее возвращения. Это дополнительная работа, которая обычно не нужна. Итак, сразу после того, как fun
возвращает, локальные переменные все еще содержат свои старые значения.
При вызове printf указатель p2
разыменовывается перед вызовом printf. Поскольку до этого не было вызвано никаких других функций, значение a от последнего вызова до fun
еще не было перезаписано. Итак, вы читаете старое значение.
Если вы должны были вызвать какую-либо другую функцию перед вызовом printf
, то ячейка памяти, ранее занятая q, будет перезаписана, так что вы, скорее всего, увидите другое значение.
Чтобы повторить, это неопределенное поведение. Не все компиляторы должны вести себя таким образом. Например, в среде с высокой степенью безопасности компилятор может очистить память стека после возвращения функции, чтобы конфиденциальные данные, используемые этой функцией, не могли быть восстановлены.
Потому что это неопределенное поведение. –
Как вы сообщаете стоимость мусора от ненужной стоимости? Ваш '10' - значение мусора, равно как и любое другое значение мусора. – AnT
'10' - это мусор. – chux