Объявление массива отрицательной длины

Что происходит в C при создании массива отрицательной длины?

Например:

int n = -35;

int testArray[n];

for(int i = 0; i < 10; i++)
    testArray[i]=i+1;

Этот код будет компилировать (и не вызывает никаких предупреждений с включенным -Wall), и кажется, что вы можете назначить testArray[0] без проблем. Присваивая прошлое, которое дает либо ошибку segfault, либо незаконную инструкцию, и чтение чего-либо из массива говорит "Abort trap" (я не знаком с этим). Я понимаю, что это несколько академический, и, надеюсь (надеюсь) никогда не появятся в реальной жизни, но есть ли какой-либо особый способ, который стандарт C говорит, чтобы обрабатывать такие массивы, или это зависит от компилятора от компилятора?

Ответы

Ответ 1

Это поведение undefined, потому что оно нарушает ограничение "must":

C99 §6.7.5.2:

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

Ответ 2

Полагаю, что поведение

Undefined, хотя и не цитирую меня.

Это дает ошибку error: size of array 'testArray' is negative в gcc:

int testArray[-35];

хотя, как вы видели:

int n = -35;
int testArray[n];

не дает ошибки даже при использовании -Wall и -W.

Однако, если вы используете -pedantic flag, gcc предупредит, что ISO C90 запрещает массив переменной длины.

Ответ 3

Сообщение erro для Visual Studio для компиляция, вы можете использовать -1, чтобы сказать пустой массив. Он ожидает, что int и вы передаете int, поэтому ошибка компилятора.