2016-02-20 22 views
0

所以我在這裏就一個關於堆棧空間的基本問題。我讀過編譯時必須知道堆棧中的變量,但我不確定這是多麼準確。讓我們這個片段:作爲數組大小的命令行參數:編譯時間還是運行時間?

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

當然,numProcesses的價值,和ARR [],不能在編譯時,編譯器知道,因此大小。那麼arr [numProcesses]如何分配,何時何地分配?感謝我肯定會是一個有見地的答案。

+0

GCC有一個擴展,允許在堆棧上分配可變長度的數組。 C99使其成爲C的官方功能。 –

+0

一個堆棧,在運行時。假裝編譯器爲你調用['alloca'](http://linux.die.net/man/3/alloca)。 (儘管alloca是一個非標準功能) – immibis

+0

不知道downvote的作用是什麼... – nirvanaswap

回答

1

首先我會回答何時以及如何在哪裏。

argc將在編譯時完成,因爲它知道它是什麼。編譯器將爲此分配內存作爲正常變量。 argv是動態部分,這將是運行時間。編譯器再次爲您分配內存,並且據我所知,也將其刪除。

由於這種情況argc所需的內存量已知,它將在堆棧上,因爲它的大小在編譯時已知。 argv將在堆上運行,因爲它的運行時間是事先不知道的。

希望這會有所幫助!

+0

何時它會刪除此內存?程序執行結束後? – nirvanaswap

+0

它會刪除argc,據我瞭解,當堆棧的其餘部分被釋放時。 argv的將由您的編譯器完全確定。一般來說,如果你的編譯器很聰明,你的編譯器會在你不再使用它的時候釋放內存。它可能會在最後刪除它,雖然一旦它被釋放,在大多數情況下它並不重要。 –