Как происходит создание переменных в Си?
По классике локальные переменные создаются на стеке. То есть там же, куда кладутся параметры функции. А после выхода из функции указатель стека возвращается на прежнее место, как бы освобождая память. Но это не настоящее выделение памяти, то есть она выделяется не из кучи, а гораздо быстрее. И также быстро освобождается.
Но вообще переменной может и не быть в памяти. Зависит от компилятора и его оптимизационных возможностей. Для ускорения программы, что логично, можно для локальной переменной использовать регистр процессора. Например, eax. Названия переменной же нет в готовом машинном коде (в релизной версии), и нет каких-то сложных манипуляций - компилятор это видит и хитрит. А то, что происходит во время дебага, может сильно отличаться от релиза.
Всякую там оптимизацию и отладочную информацию обычно можно настраивать.
Переменные, не обьявленные статическими, создаются в динамической области памяти ("куче") и будут иметь случайное значение. То, что там сейчас нуль - это вовсе не значит, что всегда и везде там будет нуль. Полагаться на то, что переменная после обьявления содержит (не содержит) какое-то значение - верный путь огрести SIGSEGV и самая распространенная ошибка.