Я написал ниже код (Только для понимания цели). Вне основного, int b; означает предварительное определение. Внутренний основной int b = 16 является локальной переменной. Внутри функциональной переменной b имеется внутренняя связь (область файла). Выходной сигнал равен 16 и 0. Я читал, что память выделяется для условно определенных переменных только тогда, когда они инициализируются. Итак, вот мой вопрос внутри функции, printf печатает значение b и выделяет ли память при вызове printf? В случае, если это так, могу ли я сказать, что память назначается предварительно определенным переменным, когда они впервые доступны (независимо от того, были ли они инициализированы или доступны)? Или я ошибаюсь?Предварительное определение и распределение памяти
int b;
int b;
void f1(int a1);
int main()
{
int b=16;
printf("b=%d\n",b);
f1(5);
return 0;
}
void f1(int a1)
{
printf("b = %d\n",b);
}
Отредактировано: Добавление больше ясности: Я понимаю, что переменная внутри функции отличается от такового в основном. Также известно, что локальная переменная находится в стеке. Мой вопрос здесь в отношении предварительного определения. int b был объявлен дважды, и он принят в C, потому что это предварительное определение. Если это фактическое определение, то несколько определений не допускаются, и, следовательно, это не принимается. Есть несколько вопросов относительно предварительного определения (About Tentative definition). Согласно одному из них «C имеет специальное правило« предварительное определение », которое допускает несколько определений для одной и той же переменной, если они все совпадают, и не более одного имеет инициализатор. Компилятор C за кулисами объединяет все предварительные определения в единое определение ". Так что, чтобы перефразировать мой вопрос:
Сохраняется ли память, если переменная определена только как условно, но не используется? (предполагая, что компилятор не оптимизирует код). Похоже, что в конце единицы перевода память распределяется по указанному выше вопросу. Или выделена ли память только тогда, когда она используется в первый раз (в данном случае в заявлении printf)?
Is 'int b; int b; 'разрешено? : O – Downvoter
* «Предварительное определение становится полным определением, если достигнут конец единицы перевода, и определение не появилось с инициализатором для идентификатора« *.Таким образом, последнее предварительное определение становится фактическим с глобальной областью и нулевой инициализацией. –
@cad: Как они идентичны: да. Не уверен, что это верно, если это, например, 'typedef int it; это b; ', приходилось искать в стандарте, но я все равно избегал бы этого, как ад. – Olaf