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

C 語言函式回傳區域陣列指標導致亂碼:堆疊記憶體生命週期解析

     編輯:程式設計疑難解答

錯誤程式碼

char* ph(char a[20], int k, int m) {
    char b[20];           // 區域陣列,分配在堆疊
    for (int i=0; i

現象解析

  1. 函式執行期間,`b` 存在於當前堆疊框架,`printf` 能正確讀取。
  2. 函式返回瞬間,堆疊框架彈出,`b` 佔用的記憶體標記為可重用。
  3. 呼叫端 `printf("%s\n", q)` 執行時,需將參數壓入堆疊,**覆蓋** 了原本 `b` 的記憶體區域,導致輸出亂碼。

為何 `int` 回傳沒事?

`int` 回傳的是值副本(通常透過暫存器 `eax/rax` 傳遞),不依賴堆疊記憶體,故不受後續堆疊操作影響。

正確解法三選一

  1. 靜態區域變數:`static char b[20];` (非執行緒安全,不可重入)。
  2. 呼叫端提供緩衝區:`void ph(char *dest, const char *src, int k)`,由呼叫端負責記憶體生命週期(推薦)。
  3. 動態配置:`char *b = malloc(20);` 回傳 `b`,呼叫端用完 `free`(易忘記釋放導致洩漏)。

呼叫端提供緩衝區範例

void ph(char *dest, const char *src, int k) {
    for (int i=0; i

結語

「區域變數地址不可外洩」是 C/C++ 記憶體安全鐵律。函式需回傳字串時,請採用「呼叫端配置、被呼叫端填充」模式,將記憶體擁有權留在呼叫端,從根源杜絕懸空指標。

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