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

я есть этот чрезвычайно тривиальный кусок кода 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[];

Почему пропуск класса хранилища приводит к другому поведению и почему первый фрагмент кода вызывает ошибку компоновщика? Благодарю.

Ответы на вопрос(2)

Ваш ответ на вопрос