C語言基礎

int *make(void) {
    int x = 42;
    return &x;
}

關於上方函式 make 所回傳的指標,下列何者正確?

  1. Ax 在程式結束前都留在同一個位置,因此隨時都能透過回傳的指標安全地讀出42
  2. Bx 在返回時會被移到堆積,因此用完後必須由呼叫端 free
  3. Cx 的生命週期在函式返回時結束,因此回傳的指標指向無效的位置,使用它是未定義行為
查看答案與解析

正確答案:C. x 的生命週期在函式返回時結束,因此回傳的指標指向無效的位置,使用它是未定義行為

x 是沒有 static 的區域變數(自動變數),函式返回時其生命週期結束,原本所在的堆疊位置會被其他函式呼叫再次使用。指向生命週期已結束之區域的指標稱為懸置指標,透過它讀寫是未定義行為。gcc 會對這種寫法發出警告,甚至可能產生回傳 NULL 的程式碼。應回傳值本身,或使用由呼叫端準備、或以 malloc 配置的區域。

  • A. 自動變數的生命週期在函式返回時結束,該位置會被其他呼叫覆寫。
  • B. 自動變數不會被移到堆積。
  • C. 正確。回傳的指標成為懸置指標。
練習這個領域 前往領域頁面

C語言基礎的其他題目

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