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

C語言函數返回值與返回指針陷阱:棧內存生命週期與臨時變量分析

     編輯:關於C語言

現象代碼


int testA() { int b=1; return b; }           // 正常
char *testB() { char str[]="abc"; return str; } // 危險!

返回值(按值返回)

  • testA 返回 int,編譯器在調用處創建臨時變量接收副本,b 銷毀不影響結果。
  • 標量、結構體(C99)按值返回均安全。

返回指針(返回局部數組地址)

  • str 是棧上數組,函數返回後棧幀銷毀,內容隨時被覆蓋。
  • 編譯器創建臨時指針變量接收地址,但指向已失效內存。
  • 「僥倖輸出正確」純屬未被覆蓋,極不穩定。

正確替代方案

返回引用

不產生副本,效率最高,但嚴禁返回局部變量引用,同樣會懸空。

編譯器警告

現代編譯器(GCC/Clang/MSVC)對返回局部地址會發出 -Wreturn-local-addr 警告,務必開啟並修復。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案代碼適用場景
靜態局部變量static char str[]="abc"; return str;單例、只讀字符串
字符串字面量return "abc";只讀常量,存儲在 .rodata
調用者提供緩衝區void testB(char *buf, size_t n) { strncpy(buf, "abc", n); }線程安全、可重入
動態分配char *p=malloc(4); strcpy(p,"abc"); return p;長度動態,調用者負責 free
返回結構體(C99)struct S { char buf[4]; }; return (struct S){"abc"};小固定長度,按值返回