int main() {
char *key[2];
scanf("%s", &key[0]);
scanf("%s", &key[1]);
printf("%s\n", &key[0]);
return 0;
}
| 輸入 | 輸出 | 說明 |
|---|---|---|
whos who | whoswho | 首字符串無結束符,連續讀取到第二個 |
wwwwww dddddd | wwwwdddddd | 前 4 字節存入 key[0],後 2 字節溢出到 key[1] 被覆蓋 |
char *key[2] 僅分配 2 個指標(每 4/8 字節),指向隨機地址,未分配字符存儲空間。scanf("%s", &key[0]) 將字符寫入 key[0] 指向的地址(垃圾值),導致未定義行為。scanf 覆蓋。char key[2][100]; // 2 行,每行 100 字元
scanf("%99s", key[0]);
scanf("%99s", key[1]);
printf("%s\n", key[0]);
char *key[2];
key[0] = malloc(100);
key[1] = malloc(100);
scanf("%99s", key[0]);
scanf("%99s", key[1]);
printf("%s\n", key[0]);
free(key[0]); free(key[1]);
char *key[2] = {"hello", "world"}; // 指向只讀區,不可修改
scanf("%s") 遇空白停止,不限制長度 → 必須用寬度限制 %99s 防溢出。char *key[N] 僅是 N 個「盒子」,裡面裝的是地址。若不往盒子裡放有效地址(malloc/靜態數組),往盒子「指向的地方」寫數據就是盲目寫隨機記憶體。務必先分配存儲空間,再讀入字符串。