关于这个问题,大家应该在很多书上看到过:
1.函数的返回值不可以是局部变量;
2.函数内的局部变量在函数调用完成之后自动销毁,因为局部变量是存放于栈空间内的;
理论很明确,但是实际应用中还是有一些疑惑的。先找几个常见的例子一步一步深入说明。
#include <stdio.h>
#include <stdlib.h>
int add_rtVal(int a,int b)
{
int c = 0;
c = a + b;
return c;
}
int main(int argc,char* argv[])
{
int a = 0,b = 0;
int c = 0;
a = 3;
b = 5;
c = add_rtVal(a,b);
printf("c=%d/n",c);
return 1;
}
这个运行结果是什么? 按照上面的理论,我们返回一个局部变量,这个局部变量在函数调用完成后已被自动销毁,那返回值应该是乱值才对。但实际上运行结果是正确的。为什么?
这个地方我曾经也很迷惑。因为有一个概念不清楚,所有不明白这什么这样可以。我们返回的是一个值 ,在返回值后我们将其赋给了变量C,相当于创建了一个副本,不论add()中的局部变量是否销毁都没有关系了。
但是如果我们返回的是一个地址,指向局部变量的地址,就不行了。因为局部变量的地址在函数调用完成后销毁,我们返回的地址就指向的区域内就不是我们想要的值了,因为这块区域已是公共的,可被其它函数占用的,其内容是不定的。看如下例子:
#include <stdio.h>
#include <stdlib.h>
char* hello()
{
char p[]= "hello world";
return p;
}
int main(int argc,char argv[])
{
char *str;
str = hello();
printf("%s/n",str);
return 1;
}
在我的电脑上,编译时会提示warning message:
hello.c: In function ‘hello’:
hello.c:25: warning: function returns address of local variable
运行结果当然是一堆乱码了。
总结一句话:要时刻清楚你使用的指针指向哪里。