首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言字符串數組陷阱:指標數組未分配內存導致覆蓋

     編輯:關於C

問題代碼

int main() {
    char *key[2];
    scanf("%s", &key[0]);
    scanf("%s", &key[1]);
    printf("%s\n", &key[0]);
    return 0;
}

錯誤現象

輸入輸出說明
whos whowhoswho首字符串無結束符,連續讀取到第二個
wwwwww ddddddwwwwdddddd前 4 字節存入 key[0],後 2 字節溢出到 key[1] 被覆蓋

根因分析

  1. char *key[2] 僅分配 2 個指標(每 4/8 字節),指向隨機地址,未分配字符存儲空間。
  2. scanf("%s", &key[0]) 將字符寫入 key[0] 指向的地址(垃圾值),導致未定義行為。
  3. 兩指標在棧上相鄰,首字符串溢出會覆蓋第二個指標的值或被第二次 scanf 覆蓋。

正確做法:分配實際存儲空間

方法一:二維字符數組(固定最大長度)

char key[2][100];  // 2 行,每行 100 字元
scanf("%99s", key[0]);
scanf("%99s", key[1]);
printf("%s\n", key[0]);

方法二:指標數組 + 動態分配

char *key[2];
key[0] = malloc(100);
key[1] = malloc(100);
scanf("%99s", key[0]);
scanf("%99s", key[1]);
printf("%s\n", key[0]);
free(key[0]); free(key[1]);

方法三:指標數組指向字符串常量(僅讀)

char *key[2] = {"hello", "world"};  // 指向只讀區,不可修改

關鍵概念釐清

  • 指標數組:存儲地址,需單獨分配目標內存。
  • 二維數組:連續內存塊,自動分配存儲空間。
  • scanf("%s") 遇空白停止,不限制長度 → 必須用寬度限制 %99s 防溢出。

總結

char *key[N] 僅是 N 個「盒子」,裡面裝的是地址。若不往盒子裡放有效地址(malloc/靜態數組),往盒子「指向的地方」寫數據就是盲目寫隨機記憶體。務必先分配存儲空間,再讀入字符串。

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