Задача статического массива C ++ с динамическим размером

Пытаясь объяснить кому-то, почему статический массив 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 даже думает, что может скомпилировать код. Мы будем очень благодарны за любые подсказки или объяснения.

Обновление: Спасибо всем за ваши полезные и смехотворно быстрые ответы!

7
задан Neil Steiner 8 June 2011 в 20:18
поделиться