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

C 語言 scanf 與 strlen 導致段錯誤:未初始化指針的經典陷阱

     編輯:程式設計綜合問答

錯誤代碼


char *s, *t;
scanf("%s", s);
scanf("%s", t);
int tLen = strlen(t);
int sLen = strlen(s);

錯誤分析

s 和 t 是未初始化的野指針,指向隨機內存地址。scanf("%s", s) 向隨機地址寫入數據,導致未定義行為(通常表現為段錯誤/訪問違例)。

正確做法:分配內存

方案一:棧上數組(推薦簡單場景)


char s[128], t[128];  // 固定大小緩衝區
scanf("%127s", s);    // 限制寬度防止溢出
scanf("%127s", t);
int tLen = strlen(t);
int sLen = strlen(s);

方案二:堆上動態分配


char *s = malloc(128);
char *t = malloc(128);
if (!s || !t) { /* 處理分配失敗 */ }

scanf("%127s", s);
scanf("%127s", t);
// 使用後釋放
free(s);
free(t);

方案三:C99 變長數組 (VLA)


size_t maxLen = 128;
char s[maxLen], t[maxLen];
scanf("%127s", s);
scanf("%127s", t);

關鍵最佳實踐

原則說明
指針使用前必須指向有效內存棧數組、malloc、calloc、strdup 等
scanf 限制寬度%127s 防止緩衝區溢出(留 1 字節給 \0)
檢查返回值if (scanf("%127s", s) != 1) { /* 輸入失敗 */ }
釋放 malloc 內存避免內存洩漏
啟用編譯器警告gcc -Wall -Wextra / MSVC /W4 會提示未初始化變量

進階:安全輸入封裝


bool safe_read_string(char *buf, size_t size) {
    if (!buf || size == 0) return false;
    // 清空緩衝區
    buf[0] = '\0';
    // 讀取整行,避免殘留換行符
    if (!fgets(buf, size, stdin)) return false;
    // 移除末尾換行符
    size_t len = strlen(buf);
    if (len > 0 && buf[len-1] == '\n') buf[len-1] = '\0';
    return true;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved