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

C 語言指針賦值陷阱:malloc 內存被字符串字面量覆蓋導致野指針

     編輯:程式設計疑難解答

錯誤代碼

char *p = (char*)malloc(sizeof(char)); // 僅分配 1 字節!
char *px = p;
p = "sajjjmmij"; // 關鍵錯誤:p 指向常量區,px 仍指向 malloc 區
printf("%s,%s", p, px); // px 輸出亂碼

記憶體圖解

執行前:
p ─────→ [Heap: 1 byte] ←──── px

執行 p = "sajjjmmij" 後:
p ─────→ [Read-only Data: "sajjjmmij\0"]
px ─────→ [Heap: 1 byte] (未初始化,內容隨機)

三個關鍵錯誤

  1. 分配空間不足:sizeof(char) = 1 字節,無法存放字符串。
  2. 直接賦值字符串字面量:p = "..." 使 p 指向只讀數據段,原 malloc 內存地址丟失(內存洩漏),px 成為懸空指針。
  3. 未拷貝內容:應用 strcpy 或 memcpy 將字符串拷貝到 malloc 區。

正確寫法

char *p = (char*)malloc(100 * sizeof(char)); // 1. 足夠空間
char *px = p;                                 // 2. 同指向堆區
strcpy(p, "sajjjmmij");                       // 3. 拷貝內容,而非改變指向
printf("%s,%s", p, px);                       // 4. 同輸出 "sajjjmmij"
free(px);                                     // 5. 釋放(px 或 p 均可,同一地址)

進階理解:指針 vs 數組 vs 字符串字面量

類型存儲區可修改生命週期
字符串字面量 "abc"只讀數據段 (.rodata)否(UB)程序全周期
char arr[] = "abc"棧 (或數據段)是作用域結束
char *p = malloc()堆是手動 free まで

總結

p = "string" 是修改指針指向,而非修改指向內存的內容。要在堆上構建字符串,必須分配足夠空間 → 拷貝內容。牢記:指針變量存地址,賦值改地址;解引用改內容。

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