教甄◆電腦科專業題庫下載題庫

上一題
在C語言中若是要於程式執行時決定Array的大小,要使用那種變數?
(A)Heap-dynamicvariable
(B)Stack-dynamicvariable
(C)Staticvariable
(D)以上皆非
編輯私有筆記
答案:A
難度:困難
1F
安身立命 國二下 (2016/03/29 14:03)
http://hatsukiakio.blogspot.tw/2009/04/c-static.html

heap
這塊區域的記憶體是由user來決定其增減的,他主要存放所有"new"出來的dynamic variable,也就是在runtime期間請求的記憶體,直得一提的是,java所有object都放在heap裡面,這是為了可以讓GC實現。
因為new出來的東西是user請求,他主要回傳一個指標(Pointer),所以相關回收動作也要由user去做,因為系統不會幫user回收new出來的記憶體。
系統只會去回收stack上的memory,如果不回收這些new出來的記憶體,而又用不到他就會造成memory leak,所以new出來的東西要由user自己去delete。
在此特別提一下,通常delete之後會再讓該指標指向NULL(第0塊位置),這是為了讓系統可以去回收這塊記憶體。就算記憶體被free掉,指標仍可以指向他。

stack
non-static的location variable(區域變數)都放會這邊,他是隨著function call一層一層堆疊,因此每進入一個scope就會疊一層,每離開一個scope就會少一層。
這邊特別標註non-static,因為static變數的話其生命週期(lifetime)會改變,雖然他仍是區域變數,但是他會放到.data的地方。
2F
安身立命 國二下 (2016/04/17 22:44)
當資訊為動態配置產生,系統會存放在另外一塊空間,稱之為『Heap』(注意這裡的Heap跟資料結構中的Heap不相關,可別會錯意!)。Heap的區塊專收執行期間動態產生的資料,由於為動態產生故結束點無法由系統來掌握,故需使用者自行回收空間。在C++或Java中利用new語法產生的就是動態配置的物件,需存放於heap中。
在 Multithreaded process 的操作系統中,Heap memory、Global variables屬於同一個 Process 的 Thread 共享的。Register values及Stack memory不共享。