Как говорит @dbush, код может легально получить доступ к памяти с именем m
, находясь внутри области действия if
.
То, где выделение будет выполнено, зависит от настроек компилятора и оптимизатора.
Без оптимизации и gcc, и clang корректируют указатель стека (выделяя память) при входе в main, но выполняют инициализацию на ноль, только если n
не равен нулю.
При оптимизации -O3 они оба вызывают только scanf
и возвращают 0, поскольку это единственные наблюдаемые эффекты. Ни один из компиляторов на самом деле не выделяет память, не просматривает отсканированное значение и не пытается инициализировать.
Доказательства: https://godbolt.org/z/6WRhxz