int a[]={};
недействительно C, подробности здесь . Причина его компиляции в том, что вы используете компилятор g cc в нестандартном режиме.
К сожалению, g cc поставляется таким образом из коробки. Чтобы использовать g cc для компиляции кода в соответствии со спецификацией языка C, вам нужно использовать gcc -std=c11 -pedantic-errors
. Где C11 является текущей основной версией стандарта, а -pedantic-errors
выдает ошибки компилятора, когда ваш код не следует этому стандарту.
Advanced: причина, по которой g cc допускает {}
в нестандартном Режим связан с массивами нулевой длины и предварительно стандартными элементами гибкого массива - старыми нестандартными вещами, которые предшествуют старому стандарту C под названием C99, выпущенному за 20 лет go. Эти старые функции - это не то, что кому-то, а тем более новичку следует пользоваться или заботиться о них.
В расширениях языка GNU C не упоминается, что произойдет, когда вы получите доступ к такому массиву за пределами. Очевидно, он падает так же, как стандартный массив.
Что вы должны сделать вместо этого, если размер массива неизвестен во время компиляции:
- Всегда компилировать с
gcc -std=c11 -pedantic-errors -Wall -Wextra
. - Возьмите размер массива в качестве ввода.
После того, как вы узнаете размер, выделите для него место. Желательно с динамическим c выделением памяти:
int* array = malloc(n * sizeof(*array)); // where n is the number of items
...
free(array);