Я всегда понимал, что когда я объявляю массив в стеке с размером, который входит в качестве переменной или параметра, я должен получить ошибку.
Однако я заметил, что не получаю никакой ошибки, если не буду явно инициализировать массив (да, он не будет в стеке, но меня интересует отсутствие ошибки).
Например, следующий код не компилируется из-за array2:
#define N 30
void defineArrays(int n)
{
int i,j;
int array1[N] = {};
int array2[n] = {};
for(i=0; i<N; ++i) array1[i] = 0;
for(j=0; j<n; ++j) array2[j] = 0;
}
Но следующий код компилируется и запускается, даже когда я посылаю реальный n из main:
#define N 30
void defineArrays(int n)
{
int i,j;
int array1[N] = {};
int array2[n];
for(i=0; i<N; ++i) array1[i] = 0;
for(j=0; j<n; ++j) array2[j] = 0;
}
Что мне здесь не хватает? Объявляет ли array2 как указатель?
Я использую GCC
Обновление: спасибо всем, кто ответил. Проблема заключалась в том, что моя версия gcc по умолчанию была C99 по какой-то странной причине (или не настолько странной, может быть, я просто слишком стар), и я неправильно предположил, что по умолчанию C90, если я не скажу иначе.