您的位置:首页 > 其它

函数返回引用和指针类型

2012-10-21 21:50 330 查看


函数返回引用和指针类型

#include <stdio.h>

#include <stdlib.h>

#include <iostream.h>

char *g()

{

char p[]="heel";

return p;

}

void main()

{

char *str=g();

cout<<*str<<endl;

printf("printf\n");

cout<<*str<<endl;

}

结果如下:

h

printf

<这里是个乱码>

Press any key to continue

或者下面这样:

#include <stdio.h>

#include <stdlib.h>

#include <iostream.h>

char *g()

{

char p[]="heel";

return p;

}

void main()

{

char *str=g();

printf("%s\n", str);

}

结果也是乱码。

问题的解答:

以下摘自http://zhidao.baidu.com/question/156881190.html

首先局部变量在函数执行完后会被释放,这个毋庸置疑。问题出在系统什么时候会释放被调用的函数栈数据。 如果在没有任何函数被调用时,原来的函数栈还是被保留的,直到调用了新的函数,新的函数栈冲掉了原来的函数栈。 因此,函数返回指针后,必须在下一个函数中立即取出,不然就被冲洗掉了。

#include <stdio.h>

#include <stdlib.h>

double* big(double a,double b)

{

printf("&a = %x &b = %x\n", &a, &b);

double* c = ( (a > b) ? &a : & b);

printf("return %x \n", c);

return c;

}

double main()

{

double a = 3.9, b = 2.0;

printf("&a = %x &b = %x\n", &a, &b);

double* c = big(a,b);

double d = *c;

printf("printf ……\n");

printf("%f %x \n", *c, c);

printf("%f %x \n", *c, c);

printf("%f %x \n", d, &d);

return 0;

}

上面的程序中有printf("printf ……\n")这一句的话结果如下



没有printf("printf ……\n")这一句的话结果如下



其他几点:

函数退出时局部变量出栈,对象肯定是销毁了。销毁指的是将那块内存标为空闲供其它变量使用,而该内存上的值仍然存在。 【释放后那块内存并不是马上就被其他地方占用,根据实际情况起码会空闲一会,可能是一瞬间。如果你的程序较复杂,那这块内存可能很快就再次被使用,如果程序很简单,可能在很长一段时间内都是空闲。所以在函数返回后将变量的值马上赋值给另外一个变量,局部变量已经销毁了,这块内存上的值还没来得及被修改,所以你的外部变量获得了一个正确的值。所以你的结果正确并不代表变量没有被销毁。无论用引用还是变量来接受局部变量的值,局部变量肯定是已经销毁了的。】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐