C語言基礎

void save(const char *input) {
    char name[8];
    strcpy(name, input);
    printf("%s\n", name);
}

把8個字元的字串 "ABCDEFGH" 傳給上方的函式 save。會發生的事,下列何者正確?

  1. A包含結尾的 '\0' 共寫入9位元組,破壞 name 外側的1位元組(未定義行為)
  2. B剛好8個字元,因此放得進 name,正確顯示 ABCDEFGH
  3. Cstrcpy 依 name 的大小截斷為7個字元,並在最後一個元素放入結尾的 '\0'
查看答案與解析

正確答案:A. 包含結尾的 '\0' 共寫入9位元組,破壞 name 外側的1位元組(未定義行為)

字串 "ABCDEFGH" 包含結尾的 '\0' 共9位元組。strcpy 不知道寫入目的地的大小,會把到 '\0' 為止的內容全部複製,因此會超出8位元組的 name,向外寫入1位元組(緩衝區溢位)。超出的部分可能破壞堆疊上的其他變數或返回位址,也被用於給予很長的輸入以執行任意程式碼的攻擊。應使用能指定寫入大小的函式來預防,例如 snprintf(name, sizeof name, "%s", input)。

  • A. 正確。第9個位元組的 '\0' 被寫到陣列外。
  • B. 8個字元的字串需要包含結尾 '\0' 的9位元組。
  • C. strcpy 不知道寫入目的地的大小,因此不會截斷。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. C語言中,參考 NULL 指標(p 為 NULL 時讀取 *p)時的說明,下列何者正確?
  2. 假設是 char 為1位元組、int 為4位元組,且 int 放在4的倍數位址上的一般環境。執行上方程式碼時的輸出,下列何者正確?
  3. uint32_t 與 uint8_t 分別是32位元與8位元的無號整數型別,且為小端序環境。執行上方程式碼時的輸出,下列何者正確?
  4. 執行上方把9放入3位元位元欄位的程式碼時的輸出,下列何者正確?
  5. 執行上方使用以 #define 定義之巨集 SQUARE 的程式碼時的輸出,下列何者正確?