什麼是動態記憶體配置

在程式執行期間配置所需大小的記憶體,用完後再釋放。C語言以 malloc(大小) 配置並取得開頭位址,以 free(位址) 釋放。calloc 回傳以0初始化的區域,realloc 回傳改變大小後的區域。配置失敗時會回傳 NULL,因此必須確認。區域位於堆積中,在釋放之前即使函式返回也會保留。小型微控制器上由於有碎片化問題,且配置所需時間難以預測,常會避免使用。

日文名稱: 動的メモリ確保

「動態記憶體配置」出現在4領域的7道練習題中(C語言基礎, 連結器與載入器與執行檔格式, 嵌入式與韌體等)。

這個名詞所屬的領域: C語言基礎

練習動態記憶體配置的題目

以C語言的malloc配置的記憶體,一般是從行程的哪個區域取得?

  1. A.text區段
  2. B堆積
  3. C.rodata區段
查看答案與解析

正確答案:B. 堆積

堆積是在程式執行中配置所需大小的記憶體,不需要時再以free歸還的區域。其特徵是配置的大小與生命週期可在執行時決定。malloc會自行管理空閒區域,不足時再請求作業系統擴大區域(在Linux中是brk或mmap系統呼叫)。若忘了free,就會殘留不再使用的記憶體,形成記憶體洩漏(memory leak)。

反覆進行malloc與free後,儘管剩餘記憶體的總量足夠,卻無法一次配置大塊區域。這種現象稱為什麼?

  1. A記憶體洩漏
  2. B碎裂(fragmentation)
  3. C堆疊溢位
查看答案與解析

正確答案:B. 碎裂(fragmentation)

反覆配置與釋放大小不一的區域後,使用中的區域之間會散布著零碎的空閒空間。即使空閒的總量很大,只要沒有連續的大塊空閒區域,配置大塊記憶體就會失敗。這稱為碎裂。記憶體配置器會依大小分開管理,或合併相鄰的空閒區域,以減少碎裂。對於長時間持續運作的嵌入式裝置,尤其需要注意。

解析中的「動態記憶體配置」

出現「動態記憶體配置」的題目(7題)

  1. 以C語言的malloc配置的記憶體,一般是從行程的哪個區域取得?
  2. 反覆進行malloc與free後,儘管剩餘記憶體的總量足夠,卻無法一次配置大塊區域。這種現象稱為什麼?
  3. 在小型微控制器的韌體中,經常避免使用malloc等動態記憶體配置,其理由下列何者正確?
  4. C語言中,(1) 在函式中沒有加 static 宣告的區域變數、(2) 以 malloc 配置的區域、(3) 在函式外宣告的變數,各自存在的期間(生命週期)的組合,下列何者正確?
  5. 在Linux的NUMA系統中常用的首次接觸(first touch)策略(將頁面放在第一次寫入該頁面的執行緒所在節點的記憶體),下列關於需要注意之處的說明何者正確?
  6. fill 與 use 是另外定義的函式。上方函式的問題點,下列何者正確?
  7. 關於上方函式 make 所回傳的指標,下列何者正確?

相關名詞

記憶體洩漏 變數 堆疊 指標(pointer) 系統呼叫 微控制器(MCU) NUMA(非均勻記憶體存取) 頁面錯誤 陣列 懸置指標

前往名詞解釋列表