Объявление против определения переменных в c

Как я знаю, это декларация:

int i;

и это определение:

int i = 10;

Может быть, я не прав, я не спорю.

Вопрос в том, выделяет ли компилятор память для объявленных (но не определенных) переменных?

3 ответа

Решение

Компилятор выделяет память для объявленных (но не определенных) переменных?

Нет, компилятор просто запомнит это имя и тип переменной. Нет памяти выделено для объявления.

int i; может вести себя как определение, если i используется (не оптимизировано) и не имеет другого определения i присутствует в любом другом модуле компиляции, и для него будет зарезервировано хранилище. (потому что хранилище зарезервировано для определений)

Определение - это когда память выделяется для переменной. Декларация не подразумевает, что хранилище уже выделено.

Объявление используется для доступа к функциям или переменным, определенным в разных исходных файлах или в библиотеке. Несоответствие между типом определения и типом объявления приводит к ошибке компилятора.

Вот несколько примеров объявлений, которые не являются определениями, в C:

extern char example1;
extern int example2;
void example3(void);

Из стандарта С (n1256):

6.7 Объявления
...
5 Объявление определяет интерпретацию и атрибуты набора идентификаторов.

Определение идентификатора - это объявление для этого идентификатора, которое:
- для объекта вызывает сохранение хранилища для этого объекта;
- для функции включает тело функции;101)
- для константы перечисления или имени typedef является (единственным) объявлением идентификатора.

"Компилятор выделяет память для объявленных (но не определенных) переменных?"

Нет. Компилятор выделяет память только для (во время) определения переменной, а не для объявления переменной.

Вы можете лучше понять логику, используя простую аналогию, множественное объявление допускается для одной переменной, а множественное определение - нет.

Другие вопросы по тегам