в школе учитель сказал мне, что когда вызов функции завершается, все, объявленное внутри блока функции, стирается.
Это вводящая в заблуждение характеристика. Если ваш инструктор использовал эту конкретную формулировку c, то он оказал вам медвежью услугу. Однако это не совсем неправильно, в зависимости от того, как его интерпретируют.
В спецификации языка сказано, что время жизни объекта, объявленного без спецификатора класса хранения внутри блока (такого как блок) служит в качестве тела функции в определении функции), когда заканчивается выполнение самого внутреннего содержащего блока. Вы можете охарактеризовать это как такие объекты, которые «стираются» в смысле стирания из существования , но не в смысле очистки их содержимого.
результат был 9999, что не соответствует тому, чему меня учили.
Пытаясь быть максимально доброжелательным по отношению к инструктору, я предлагаю подумать, что вы, возможно, неправильно поняли то, что они пытались сказать Вы.
В любом случае попытка получить доступ к объекту, срок жизни которого истек, приводит к неопределенному поведению . Более того, когда время жизни объекта заканчивается, значения любых указателей на этот объект становятся неопределенными. Это означает, что вывод вашей программы, на самом деле не может , противоречит тому, что спецификация языка говорит о ситуации, потому что вывод программы не определен. Любые выходные данные или их отсутствие будут одинаково соответствовать семантике языка C. Если мы предполагаем, что ваш инструктор пытался передать характеристику, соответствующую спецификации, то они также не противоречат.