C語言基礎

int process(int n) {
    int *buf = malloc(n * sizeof(int));
    if (buf == NULL) return -1;
    if (fill(buf, n) != 0)
        return -2;
    use(buf, n);
    free(buf);
    return 0;
}

fill 與 use 是另外定義的函式。上方函式的問題點,下列何者正確?

  1. Afill 回傳0以外的值時,沒有釋放 buf 就返回,配置的區域會一直未被釋放
  2. B沒有確認 malloc 的回傳值,因此配置失敗時會參考 NULL
  3. C在 free 之後使用了 buf,因此會參考已釋放的區域
查看答案與解析

正確答案:A. fill 回傳0以外的值時,沒有釋放 buf 就返回,配置的區域會一直未被釋放

以 malloc 配置的區域,在以 free 釋放之前會一直保留。在 fill 失敗並以 return -2 返回的路徑上沒有呼叫 free,buf 的值(位址)也遺失了,因此該區域再也無法釋放。這稱為記憶體洩漏,函式被反覆呼叫時可用的記憶體會持續減少,對長時間持續運作的嵌入式裝置或伺服器尤其是問題。應在返回前呼叫 free(buf),或把釋放處理集中在函式最後的一處。

  • A. 正確。在錯誤返回的路徑上沒有呼叫 free,造成記憶體洩漏。
  • B. 在 malloc 之後立刻確認了 buf == NULL,失敗時回傳 -1。
  • C. 在 free(buf) 之後並沒有使用 buf。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 關於上方函式 make 所回傳的指標,下列何者正確?
  2. C語言中,建議在 free(p); 之後立刻寫 p = NULL; 的理由,下列何者最適當?
  3. 把8個字元的字串 "ABCDEFGH" 傳給上方的函式 save。會發生的事,下列何者正確?
  4. C語言中,參考 NULL 指標(p 為 NULL 時讀取 *p)時的說明,下列何者正確?
  5. 假設是 char 為1位元組、int 為4位元組,且 int 放在4的倍數位址上的一般環境。執行上方程式碼時的輸出,下列何者正確?