char *strA()

{

  char str[] = "hello word";

  return str;

}

上述程序有什么问题?

简单的来说,str是个局部变量的地址,作为返回值,有可能被提前回收。

那么局部变量可以作为函数的返回值吗,这个问题不能一概而论。局部变量作为返回值时,一般是系统先申请一个临时对象存储局部变量,也就是找个替代品,这样系统就可以回收局部变量,返回的只是个替代品。

了解完局部变量返回的过程,那么如果返回的是一个基本类型的变量,比如:

int a;

a = 5;

return a;

那么就会有一个临时对象也等于a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题。

那么如果是指针,这么返回就问题很大,因为你返回的局部变量是地址,地址虽然返回了,但地址所指向的内存中的值已经被回收了,你主函数再去调,就有问题了。这个问题也是可以解决的,可以把局部变量变为静态变量或者全局变量,这样就不存放在栈中了,而是存放在静态存储区,不会被回收。

 

char str[] = "hello word";//分配一个局部变量

char *str= "hello word";//分配一个全局变量

posted on 2018-03-10 23:01  Mini_Coconut  阅读(2496)  评论(0编辑  收藏  举报