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

C 語言函式回傳區域陣列指標:同樣的錯誤,不同的解釋角度

     編輯:程式設計疑難解答

錯誤本質

區域陣列 `char b[20]` 存活於函式堆疊框架,函式返回後框架銷毀,記憶體失效。回傳其指標屬於懸空指標,後續存取屬於未定義行為。

對比 24692 的補充說明

  • 24692 強調 `printf` 參數壓棧覆蓋導致亂碼的具體機制。
  • 本回答直指核心:**區域變數自動儲存期結束即失效**,無論後續是否被覆蓋,行為皆不可預期。

記憶體模型視覺化

呼叫 ph() 前:
[main 堆疊框架] ...

呼叫 ph() 時:
[main 框架] [ph 框架: b[20] 在此] ...

ph() 返回後:
[main 框架] [ph 框架已彈出,b 記憶體標記為自由] ...

main 繼續執行 printf:
[main 框架] [printf 參數壓棧,恰好覆蓋舊 b 區域] → 亂碼

最佳實踐重申

永遠不要回傳區域變數(陣列、結構體、類物件)的指標或引用。改用輸出參數、回傳值副本、智慧指標管理動態記憶體,或 C++ 標準容器(`std::string`, `std::vector`)。

結語

理解自動儲存期與動態儲存期的區別,是從「能跑」進階到「健壯」的分水嶺。

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