指针生命期,作用域有关问题

指针生命期,作用域问题

char   *   func()
{
char   pa[]= "123 ";
char   *   p   =   "456 ";
return   pa;
}
 
这个函数,能return吗  

或者换成   return   p;正确吗  

我的疑问是:pa明显是局部作用域,那么在函数返回后,自动被系统回收,这样的话,return   pa。应该不成立  
 
另外,return   p;
p这个指针本身是局部作用,而它指向的常量字符串,应该是全局数据区。那么在函数返回后,p这个指针本身,也是应该被回收。这样,是不是return   p。也不应该成立?

------解决方案--------------------
pa是一个局部变量,在返回后,pa所指向的地址被释放,所指向的内容是一堆不可确认的东西,所以不能返回
p是一个全局静态常量,返回没问题,但是所指向的内容始终是常量,无法改变
------解决方案--------------------
char * func()
{
char pa[]= "123 ";
char * p = "456 ";
return pa;
}
这个函数,能return吗
或者换成 return p;正确吗
我的疑问是:pa明显是局部作用域,那么在函数返回后,自动被系统回收,这样的话,return pa。应该不成立


return pa肯定是不行的。因为pa是一个数组名,它是一个栈内的变量,当离开函数域,也就是它的生命期时,它被销毁。它返回的将是一个垃圾,会是乱码之类的东西。所以不能接收。


另外,return p;
p这个指针本身是局部作用,而它指向的常量字符串,应该是全局数据区。那么在函数返回后,p这个指针本身,也是应该被回收。这样,是不是return p。也不应该成立?


return p其实是可以正常工作的,但是在林锐的书中明确说了,这是一种不和常理的行为,不给予提倡。因为p所指向的是一个常量字符串,正如楼主所说,它在全局数据区,它的生命期也是程序级的。函数结束之后,p结束了生命期被销毁,但是它所指向的字符串生命期仍然存在,所以在函数外面接收这个返回值还是可以指向这个字符串的。

------解决方案--------------------
指针本身分配在栈上,指针指向的用new 或者malloc分配的空间在堆上,
栈上空间函数返回就释放,堆上空间,进程结束释放,或者手动释放