Аргумент командной строки как размер массива: время компиляции или время выполнения?

Итак, я здесь с очень фундаментальным вопросом о пространстве стека. Я читал, что переменные в стеке должны быть известны во время компиляции, но я не уверен, насколько это точно. Возьмем этот фрагмент:

int main(int argc, char*argv[])
{
int numProcesses = argv[1];
int arr[numProcesses] = {};
...
}

Естественно, значение numProcesses и, следовательно, размер arr[] не могут быть известны компилятору во время компиляции. Итак, как, когда и где выделяется arr[numProcesses]? Спасибо за то, что я уверен, будет проницательным ответом.


person nirvanaswap    schedule 20.02.2016    source источник
comment
GCC имеет расширение, позволяющее размещать в стеке массивы переменной длины. C99 делает его официальной функцией C.   -  person Colonel Thirty Two    schedule 20.02.2016
comment
Один стек во время выполнения. Представьте, что компилятор вызывает для вас alloca. (Хотя alloca - нестандартная функция)   -  person user253751    schedule 20.02.2016
comment
Не знаю, о чем минус...   -  person nirvanaswap    schedule 20.02.2016


Ответы (1)


Сначала отвечу когда и как потом где.

argc будет выполняться во время компиляции, поскольку тогда известно, что это такое. Компилятор выделит для этого память как для обычной переменной. argv — это динамическая часть, и это будет время выполнения. Компилятор снова выделит вам память и, насколько я знаю, удалит ее.

Поскольку объем памяти, необходимый для случая argc, известен, он будет находиться в стеке, поскольку его размер известен во время компиляции. argv будет находиться в куче, поскольку он динамически выделяется во время выполнения, поскольку его длина заранее не известна.

Надеюсь это поможет!

person Careful Now    schedule 20.02.2016
comment
Когда он удалит эту память? После завершения выполнения программы? - person nirvanaswap; 20.02.2016
comment
Насколько я понимаю, он удалит argc, когда остальная часть стека будет освобождена. argv будет полностью определяться вашим компилятором. Как правило, ваш компилятор освобождает память после того, как вы ее больше не используете, если он умен. Он может просто удалить его в конце, хотя после его освобождения в большинстве случаев это не имеет большого значения. - person Careful Now; 20.02.2016