Объявление массива отрицательной длины
Что происходит в 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, поэтому ошибка компилятора.