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

C 語言 scanf 字符串指針未分配內存導致段錯誤:正確分配與安全輸入

     編輯:程式設計疑難解答

錯誤代碼

char *department = NULL;
scanf("%s", department); // 段錯誤:向地址 0 寫入

原因

指針僅存儲地址,**未指向有效內存區域**。`scanf` 將輸入寫入指針指向的地址,野指針導致非法訪問。

正確做法

  1. 數組法(推薦簡單場景):
    char department[256];
    scanf("%255s", department); // 限制寬度防溢出
    
  2. 動態分配:
    char *department = malloc(256);
    if (department) {
        scanf("%255s", department);
        // 用完 free(department);
    }
    
  3. 不定長輸入(POSIX `getline` / C11 `scanf("%ms")`):
    char *line = NULL;
    size_t len = 0;
    getline(&line, &len, stdin); // 自動擴容,需 free(line)
    

安全建議

  • **永不使用無寬度限制的 `%s`**,改用 `%255s` 或 `%ms`。
  • MSVC 推薦 `scanf_s("%s", buf, sizeof(buf))`。
  • 輸入可能含空格時用 `fgets` 或 `scanf("%255[^\n]", buf)`。

總結

指針使用前必須指向合法內存(數組、malloc、getline 分配)。固定長度用棧上數組最簡單;不定長用 `getline`/`%ms` 自動管理。

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