指针生命期,作用域有关问题
指针生命期,作用域问题
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分配的空间在堆上,
栈上空间函数返回就释放,堆上空间,进程结束释放,或者手动释放
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分配的空间在堆上,
栈上空间函数返回就释放,堆上空间,进程结束释放,或者手动释放