Ваше понимание верно. func
a
инициализируется с мусорным стеком.
Каждый раз, когда вы говорите int a;
, он создает новую переменную, не имеющую отношения к переменным с одинаковыми именами из окружающих областей или переменных из других функций выше стека вызовов.
В своем оправдании вы вводите в заблуждение Область действия и степень . c использует лексическую область видимости , поэтому, хотя «экстент» (или время жизни) main
существует посредством выполнения func
, это совершенно другая область действия, поэтому он ссылается на совершенно другую переменную.
Обратите внимание, что "внешняя область видимости" - это, как правило, скобки, находящиеся вне вашей области, а самой внешней областью видимости является уровень файла.
int a; // global
void func(int a) { // parameter
int a; // function local
while (0) {
int a; // scoped in the 'while'
if (true) {
int a; // scoped in the 'if'
}
}
}
Каждая из этих переменных 'a' тени другая 'a над ней.
Исключением (может быть источником вашей путаницы) является переменная, объявленная extern int a;
. Эта переменная, в частности, относится к переменной откуда-то еще (другая единица перевода). Внешнее объявление может использоваться для получения поведения, которого вы не ожидали:
Внешняя переменная также может быть объявлена внутри функции. В этом случае вы должны использовать ключевое слово extern, в противном случае компилятор будет рассматривать его как определение локальной переменной, которая имеет другую область видимости, время жизни и начальное значение. Это объявление будет видно только внутри функции.
Исключением из правила "стека мусора" является то, что static
и переменные, выделенные из кучи, инициализируются нулями (если я не ошибаюсь, это обеспечивается стандартом).
А также обратите внимание, что «значение мусора» может быть 3.