Видите, что случилось в первой программе.
Перед вызовом alocar у нас есть только переменная n в main, указывающая на какое-то неопределенное место:
main()::n [ X--]--->(?)
(есть значение в квадратных скобках, которое не определено, помечено как X). Затем мы вызываем alocar, и у нас есть другая переменная в области видимости alocar, которая имеет копию origianl var.
main()::n [ X--]--->(?)
alocar()::n [ X--]-----^
Теперь выделите немного памяти:
main()::n [ X--]--->(?)
alocar()::n [ *--]--->[ Y ]
Назначить значение выделенной переменной:
main()::n [ X--]--->(?)
alocar()::n [ *--]--->[ 12 ]
Return. alocar () :: n удаляется, поскольку он существует только при выполнении alocar ().
main()::n [ X--]--->(?)
[ 12 ]
main () :: n по-прежнему указывает на какое-то неопределенное место ... (которое, возможно, хранит значение 0) И никто не указывает на выделенное место.