Пытаясь объяснить кому-то, почему статический массив C ++ не может быть динамически изменен, я обнаружил, что gcc не согласен со мной.Как следующий код даже компилируется, учитывая, что измерение argc из array не известно во время компиляции?
#include <iostream>
int main(int argc, char* argv[]) {
int array[argc];
for(int i = 0; i < argc; i++) array[i] = argv[i][0];
for(int i = 0; i < argc; i++) std::cout << i << ": " << char(array[i]) << std::endl;
//for(int i = 0; i < 100; i++) { std::cout << i << " "; std::cout.flush(); array[i] = 0; }
return 0;
}
Я проверил это с помощью gcc 4.2.1, и указал -Wall, не получая столько грязного взгляда от компилятора.Если я раскомментирую последний цикл, я получаю ошибку segfault, когда назначаю массив [53] .
. Ранее я размещал защитные массивы до и после объявления array и заполнил их нулями, уверенными, что программа должна уничтожать часть своего стека, но gcc переупорядочил переменные в стеке, так что я не смог наблюдать искажения данных.
Очевидно, яне пытаясь заставить этот код "работать".Я просто пытаюсь понять, почему gcc даже думает, что может скомпилировать код.Будем очень благодарны за любые подсказки или объяснения.
Обновление: Спасибо всем за ваши полезные и смехотворно быстрые ответы!