遇到过好几次关于函数返回指针变量问题,有时候是可以的,有时候是不可以的,然后就混乱了。今天研究了下,结果发现原来和内存分配有关。
用下面的例子分析下吧:
- char * test() {
- char a[] = "abc";
- char * p = a;
- return p;
- }
- int main() {
- printf("%s", test());
- return 0;
- }
这段 p 是局部指针,指向局部数组 a, 这种情况输出为空或者奇怪字符串。
分析:
a 是局部数组,系统为其分配的是栈内存,test()函数一结束,a 的生命结束,其所占内存被释放,p 也被释放,返回回来的是被释放的内存,输出必然不正确。
- char * test() {
- char * p = "abc";
- return p;
- }
- int main() {
- printf("%s", test());
- return 0;
- }
这段输出是 "abc"。
为什么这样又是正确的呢?
因为 p 虽然为局部指针,函数结束,p 被释放,但是 p 指向的并不是栈内存,而是常量存储区,即使函数结束,这段内存存储的仍旧是 "abc",所以返回回来的地址是有效的,结果自然是正确的。
再用一个 strcpy 函数的实现来举例:
- char * strcpy(char * strDest, const char * strSrc) {
- assert(strDest != null && strSrc != null);
- char * address = strDest;
- while ( * strDest++=*strSrc++);
- return address;
- }
显然,返回的也是局部指针 address,并且是正确的。
因为 address 指向的地址是 strDest 所指地址,而 strDest 指向的地址是作为参数传给函数的,所以即便函数结束,释放了 address,但返回的地址仍旧是有效的,即目的地址。
总结:返回局部指针时,要依据其指向的地址,在函数退出后是否有效来判断返回是否是想要得到的结果。
来源: http://www.cnblogs.com/yangsisi99/p/5903128.html