实例:你们认为这三个函数能正常返回吗?
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的临时变量就是这个副本的地址,里边的东西已经被干掉了,所以不能正常返回。