C語言函式返回值的實現方法和誤區
阿新 • • 發佈:2018-12-16
例項:你們認為這三個函式能正常返回嗎?
int func1(int a , int b) { int c = 0; c = a + b; return c; } char * func2() { char *strTmp = "abs"; return strTmp; } char *func3() { char buf[] = "qwe"; return buf; } int main() { int rec = 0; int x = 1; int y = 2; rec = func1( x , y ); printf("rec = %d\n" , rec); char *str; str = func2(); printf("%s\n" , str); str = func3(); printf("str = %s\n" , str); return 0; }
func1和func2一定是可以返回的,func3不能返回,為什麼呢?
先來理解一下函式返回值的原理func1的實現流程,main函式變數x,y複製到函式func1的棧上a,b。此時,定義了一個區域性變數c,把a+b的值賦值給c,return c的時候會把區域性變數c的值賦值到一個系統自動生成和管理的臨時變數c`上,並把區域性變數c的值銷燬,rec=func1(x,y);時,rec=臨時變數c`的值。所以可以正常返回。
那麼同理對比func2和func3,有什麼區別?
區別在於char *str= "abs";“abs”字串儲存在程式的常量儲存區,str指向這個變數,當函式返回的時候,strTmp的臨時變數裡儲存的是“abs”的地址,,而“abs”的地址裡是常量儲存區,所以可以正常返回。
而char str[] = "qwe";"qwe"雖然儲存在常量儲存區,但str只是一個副本,所以函式返回時這個副本的內容被銷燬了,而return的buf的臨時變數就是這個副本的地址,裡邊的東西已經被幹掉了,所以不能正常返回。