在 C 語言中,若直接將字串常量複製給未初始化的指標,再嘗試逐字列印,程式會崩潰並報 Segmentation fault: 11。
char *s = "hello world";
char *n; // 未初始化,指向隨機記憶體
strcpy(n, s); // 複製到非法位址
// printf("%s", n); // 若直接用 %s 可能碰巧能印出
for (int i = 0; i < strlen(n); i++) {
printf("%c", n[i]); // 逐字存取觸發段錯誤
}
char *n; 只是宣告一個指標,並未分配儲存空間,指標值是隨機的。strcpy 會嘗試將資料寫入該隨機位址,導致未定義行為。若後續用 %s 列印,printf 會從該位址讀取直到遇到 \0,可能碰巧不崩潰;但逐字存取 n[i] 時,編譯器產生的程式碼會直接解參考該無效位址,觸發作業系統的記憶體保護機制。
char *n = malloc(strlen(s) + 1); 或使用陣列 char n[100];。strncpy 或 snprintf 避免緩衝區溢位。char *s = "hello world";
char *n = malloc(strlen(s) + 1); // 分配空間
if (n) {
strcpy(n, s);
for (int i = 0; i < strlen(n); i++) {
printf("%c", n[i]);
}
free(n); // 釋放記憶體
}
記得:指標使用前必須指向有效記憶體區域,這是 C 語言記憶體管理的基礎。