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

C 語言指標字串陣列未配置記憶體導致 gets 崩潰

     編輯:程式設計綜合問答

錯誤代碼

char *str[10];  // 僅宣告 10 個指標,未指向有效記憶體
for (int i = 0; i < 10; i++)
    gets(str[i]); // ❌ 寫入野指標,未定義行為

正確配置方式

  1. 靜態二維陣列:
    char str[10][100]; // 每行最多 99 字元 + \0
    gets(str[i]); // 直接用陣列名退化為指標
    
  2. 動態分配:
    char *str[10];
    for (int i = 0; i < 10; i++) {
        str[i] = malloc(100);
        gets(str[i]);
    }
    // 使用後釋放
    for (int i = 0; i < 10; i++) free(str[i]);
    
  3. 單一緩衝區重用 (若不需同時保存):
    char buf[100];
    for (int i = 0; i < 10; i++) {
        gets(buf);
        // 處理 buf...
    }
    

安全性警告

gets() **已移除 (C11)**,無緩衝區長度檢查,極易緩衝區溢位。**務必改用 fgets(str, sizeof(str), stdin)**。

修正後安全版本

char str[10][100];
for (int i = 0; i < 10; i++) {
    if (fgets(str[i], sizeof(str[i]), stdin) == NULL) break;
    str[i][strcspn(str[i], "\n")] = '\0'; // 移除換行
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved