У меня есть этот чрезвычайно тривиальный кусок кода C:
static int arr[];
int main(void) {
*arr = 4;
return 0;
}
Я понимаю, что первое утверждение недопустимо (я объявил массив области файла со статической продолжительностью хранения и связью файлов, но без указанного размера), но почему это приводит к ошибке компоновщика? :
/usr/bin/ld: /tmp/cch9lPwA.o: in function 'main':
unit.c:(.text+0xd): undefined reference to 'arr'
collect2: error: ld returned 1 exit status
Разве компилятор не сможет поймать это перед компоновщиком?
Мне также странно, что, если я опускаю static
класс хранения, компилятор просто предполагает, что массив имеет длину 1
и не выдает ошибок, кроме этого:
int arr[];
int main(void) {
*arr = 4;
return 0;
}
Результаты в:
unit.c:5:5: warning: array 'arr' assumed to have one element
int arr[];
Почему пропуск класса хранилища приводит к другому поведению и почему первый фрагмент кода вызывает ошибку компоновщика? Благодарю.