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

C 語言 Segmentation Fault 常見原因分析:scanf 參數錯誤與變長數組陷阱

     編輯:程式設計疑難解答

錯誤代碼回顧

int main() {
    int n;
    scanf("%d", n); // 缺少 &
    char zfc[n];    // 變長數組 (VLA)
    scanf("%s", &zfc[0]);
}

兩大致命錯誤

  1. scanf("%d", n) 缺少取地址符:n 的值被當作地址訪問,導致非法內存寫入,直接觸發 Segmentation Fault。
  2. 變長數組 char zfc[n] 風險:C99 支持 VLA,但棧空間有限,若 n 較大易導致棧溢出;部分編譯器(如 MSVC)不支持 VLA,編譯會失敗。

修正版代碼

int main() {
    int n;
    scanf("%d", &n); // 加上 &
    // 建議使用固定大小或動態分配
    char *zfc = malloc(n + 1);
    if (zfc) {
        scanf("%s", zfc);
        free(zfc);
    }
    return 0;
}

調試建議

使用 gdb 或 valgrind 定位非法內存訪問行;開啟編譯器警告(-Wall -Wextra)可捕獲 scanf 格式與參數不匹配。

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