Q134.
針對下列C++語言fn 程式,那些敘述錯誤?
電腦軟體設計(C++) · 乙級 · C++ · Q134
難易度分析
4 / 5
本題採取複選形式,要求對多個選項進行真偽判定,且涉及 C-String 與字元陣列在記憶體佈局上的細微區別以及未定義行為的判讀,需要對底層記憶體終止機制有精確的掌握。
正確答案 (複選):②, ③, ④
- ② 執行 fn(""); 會產生錯誤:此敘述錯誤。執行 fn("") 不會產生錯誤,空字串 仍是合法的 C-String,其長度為 0(若 fn 回傳長度加 1 則回傳 1),程式可正常執行。
- ③ 執行 char a[]={'a', 'b', 'c'}; fn(a); 會回傳4:此敘述錯誤。字元陣列 `char a[]={'a','b','c'}` 缺少 null terminator,不是合法的 C-String。將其傳入期望 C-String 的函式會導致 未定義行為 (Undefined Behavior),strlen 會持續讀取記憶體直到偶然遇到 '\0',回傳值無法預測為 4。
- ④ 本程式無法編譯執行:此敘述錯誤。該 C++ 程式語法正確,使用標準的 字串處理函式,可以正常編譯與執行。
錯誤選項解析
- ① 執行 fn("abcd"); 回傳5:此敘述正確。C-String "abcd" 包含 4 個可見字元加上結尾的 null terminator ('\0'),若 fn 函式計算字串長度並回傳包含終止字元的總長度,則回傳值為 5,故此敘述並非錯誤。
Learning Tip
"本題核心考點為 C-String 的 null terminator 機制 與 未定義行為 的辨識。常考陷阱:(1) 字串字面常量 "abc" 會自動加入 '\0',但手動宣告的字元陣列 `char a[]={'a','b','c'}` 不會。(2) 缺少終止字元的陣列傳入 strlen 等函式會造成 buffer over-read,屬於嚴重的安全漏洞。實務上應優先使用 std::string 而非 C-String 以避免此類問題。"
學員答題分佈
①執行 fn("abcd"); 回傳50%
②執行 fn(""); 會產生錯誤0%
③執行 char a[]={'a', 'b', 'c'}; fn(a); 會回傳40%
④本程式無法編譯執行0%
此答題分佈是根據學員在 LongePass 模擬考等實際作答紀錄計算而成。與考友分享這道歷屆試題與詳細解析!