Объявление массива отрицательной длины - PullRequest
15 голосов
/ 24 сентября 2010

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

Например:

int n = -35;

int testArray[n];

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

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

Ответы [ 3 ]

20 голосов
/ 24 сентября 2010

Это неопределенное поведение, потому что оно нарушает ограничение "обязать":

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

3 голосов
/ 24 сентября 2010

Неопределенное поведение, я полагаю, хотя не цитируйте меня об этом.

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

int testArray[-35];

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

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

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

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

0 голосов
/ 24 сентября 2010

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

...