首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C語言 strcpy 函數複製字串後逐字列印導致 Segmentation Fault 的原因與解決

     編輯:程式設計綜合問答

問題現象

在 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] 時,編譯器產生的程式碼會直接解參考該無效位址,觸發作業系統的記憶體保護機制。

正確做法

  1. 為指標分配記憶體:char *n = malloc(strlen(s) + 1); 或使用陣列 char n[100];。
  2. 複製前務必確認目標緩衝區足夠大且已初始化。
  3. 使用 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 語言記憶體管理的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved