1. 程式人生 > >C語言函式返回值的實現方法和誤區

C語言函式返回值的實現方法和誤區

例項:你們認為這三個函式能正常返回嗎? 

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的臨時變數就是這個副本的地址,裡邊的東西已經被幹掉了,所以不能正常返回。