Пытаясь объяснить кому-то, почему статический массив C ++ не может быть динамически изменен, я обнаружил, что gcc не согласен со мной. Каким образом компилируется следующий код, учитывая, что размер argc из массива неизвестен во время компиляции?
#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 даже думает, что может скомпилировать код. Мы будем очень благодарны за любые подсказки или объяснения.
Обновление: Спасибо всем за ваши полезные и смехотворно быстрые ответы!