2016-02-20 1 views
0

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

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

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

+0

GCC имеет расширение, позволяющее распределять массивы переменной длины в стеке. C99 делает его официальной особенностью C. –

+0

Один стек, во время выполнения. Придумайте для компилятора вызовы ['alloca'] (http://linux.die.net/man/3/alloca) для вас. (Хотя alloca - нестандартная функция) – immibis

+0

Не знаете, что такое downvote ... – nirvanaswap

ответ

1

Сначала я отвечу, когда и как тогда, где.

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

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

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

+0

Когда он удалит эту память? После завершения выполнения программы? – nirvanaswap

+0

Он удалит argc, как я понимаю, когда остальная часть стека освобождается. argv будет полностью определен вашим компилятором. Обычно ваш компилятор освобождает память после того, как вы больше не используете ее, если она умна. Он может просто удалить его в конце, хотя, как только он будет освобожден, в большинстве случаев это не имеет большого значения. –

Смежные вопросы