LONGEPASS
電腦軟體設計(C++)/C++/Q42
中等
正確率 -
Q42.

對於C 程式的宣告,char *b, *d[8]; int x=5, y, *z; 以下那一個比較正確?

電腦軟體設計(C++) · 乙級 · C++ · Q42

難易度分析

3 / 5

本題要求考生能正確辨析指標與指標陣列的宣告區別,並理解 C++ 語言在記憶體動態配置時對型別轉換的嚴格要求,以及變數型別指派的合法性。

正確答案:②b=(char *) malloc(x* sizeof(char));

② b=(char *) malloc(x* sizeof(char));:使用 `(char *)` 進行顯式型別轉換將 `malloc()` 回傳的 `void*` 轉為 `char*`,符合 C++ 的嚴格型別檢查要求。`x*sizeof(char)` 正確計算了 5 個 char 的記憶體空間,且 `b` 本身宣告為 `char*`,型別匹配正確。

錯誤選項解析

  • ① b= malloc(x*sizeof(char));:在 C++ 中,`malloc()` 回傳的是 `void*` 型別,若未進行顯式型別轉換直接指派給 `char*` 指標會導致編譯錯誤。C 語言允許隱式轉換,但此題為 C++ 情境,故缺少 cast 的寫法不正確。
  • ③ d=(char *) malloc(x* sizeof(char));:`d` 的宣告為 `*d[8]`,代表 指標陣列(array of 8 char pointers),而非單一指標。陣列名稱是不可修改的左值(non-modifiable lvalue),不能直接對其進行 `malloc` 指派操作。
  • ④ x = (int *) malloc(y* sizeof(int));:`x` 的型別是 `int`(純量整數),而非指標型別,不能將 `malloc` 回傳的記憶體位址指派給整數變數。此外,`y` 尚未初始化即用於計算大小,會產生未定義行為(Undefined Behavior)。
Learning Tip

"本題核心考點為 C++ 的型別安全機制與變數宣告解讀。關鍵陷阱:(1) `char *b, *d[8]` 中,`b` 是單一指標,`d` 是指標陣列,兩者型別完全不同;(2) C++ 要求 `malloc` 必須搭配顯式 cast,而 C 語言可隱式轉換;(3) 使用 `malloc` 前務必確認目標變數為指標型別且大小參數已初始化。實務上建議優先使用 `new/delete` 取代 `malloc/free` 以符合 C++ 慣用法。"

學員答題分佈

①b= malloc(x*sizeof(char));0%
②b=(char *) malloc(x* sizeof(char));0%
③d=(char *) malloc(x* sizeof(char));0%
④x = (int *) malloc(y* sizeof(int));0%

此答題分佈是根據學員在 LongePass 模擬考等實際作答紀錄計算而成。與考友分享這道歷屆試題與詳細解析!

相似類型題目