函数的局部变量用作函数返回值
来源于http://www.cnblogs.com/Jezze/archive/2012/02/06/2340686.html
函数的局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针指向的内容就无意义了,但是对于静态变量也可以返回其指针。
如以上代码,函数返回的是局部变量的指针,此时在主函数里打印出的r应该不等于23,可是实际结果却是23,当在打印结果之前再添加一个printf语句时打印的结果才不会是23,在CSDN上讨论:http://topic.csdn.net/u/20120206/22/487c9e4f-bf36-4ed1-9e6a-a6e7cb7404e5.html?seed=1431559918&r=77464424#r_77464424,这里系统可能没及时回收局部变量才导致打印出的还是局部变量的值#include "stdio.h" int *a() { int b; int *p; b=23; printf("b=%d \n",b); return &b; } void main() { int *r; r=a(); //printf(""); printf("r=%d",*r); getch(); }
具体的应该如下:
1. 如果返回一个基本类型的变量,比如:
int a;
a = 5;
return a;
那么就会a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题。
2. 但是对于指针,像1那么做就会有问题,比如在某个函数内部:
int a[] = {1, 2};
return a;
那么也会返回指针a的一个拷贝,我们假定a的地址值为0x002345FC,那么这个0x2345FC是能够成功返回的。当return执行完成后,a就要被销毁,也就是0x002345FC所指向的内存被回收了。如果这时候在函数外面,去地址0x002345FC取值,那得到的结果肯定是不对的。这就是为什么不能返回局部指针的原因。返回局部变量的引用的道理和这个类似。
3. 对于静态变量:
static int b=10;
return &b;
由于静态变量是存放在静态存储区的,所以不会被系统回收,所以返回值还是有效的。