崩潰代碼
main() {
char* greeting = "hello "; // 指向只讀字面量區
char* name; // 未初始化野指針
scanf("%s", name); // 寫入隨機地址
strcpy(greeting, name); // 嘗試修改只讀內存
printf("%s", greeting);
}
三大錯誤
greeting 指向字符串字面量(只讀段),不可修改。name 未分配內存,scanf 寫入任意地址。strcpy 目標地址不可寫,導致 Segmentation Fault。
修正版
int main() {
char greeting[40] = "hello "; // 可修改的數組
char name[40]; // 分配棧內存
scanf("%s", name); // 安全讀入
strcpy(greeting, name); // 合法拷貝
printf("%s", greeting);
return 0;
}
核心原則
- 字符串字面量
const char* 僅供讀取,需拷貝到數組中才能修改。 - 指針使用前必須指向有效內存(數組、
malloc 返回值)。 - 目標緩衝區大小必須 ≥ 源字符串長度 + 1(結束符)。