返回信息流char *fun2(void)
{
char buffer[4]={'a','b','c','d'};
return buffer;
}
char *fun3(void)
{
char *s=malloc(4);
int i;
for(i=0;i<4;i++)
{
*(s+i)=97+i;
}
return s;
}有两个这样的函数。
main()
{
char *p1,*p2;
p1=fun2();
p2=fun3();
}
这样得到指针之后输出看结果,p2输出结果就是a,b,c,d但是p1输出的就是乱码。
我知道在fun2中,buffer[]是局部变量,当函数运行结束后,内存就被释放,所有再读取buffer所指内容也就没有了意义,但是为什么fun3()返回的指针就可以呢?这里难道透露出指针域数组有什么差别吗?
大神勿喷!!
这是一条镜像帖。来源:北邮人论坛 / cpp / #75293同步于 2013/11/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
指针与数组
HFlyaway
2013/11/20镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
【 在 HFlyaway 的大作中提到: 】
: char *fun2(void)
: {
: char buffer[4]={'a','b','c','d'};
: ...................
malloc的内存是在堆上。函数结束后,堆上的内存还是存在的、而buffer是在栈中分配的。函数结束后,栈要回收、而且char buffer[4] = {'a','b','c','d'};也不对、字符数组最后一个元素是'\0'
【 在 qazplm 的大作中提到: 】
: malloc的内存是在堆上。函数结束后,堆上的内存还是存在的、而buffer是在栈中分配的。函数结束后,栈要回收、而且char buffer[4] = {'a','b','c','d'};也不对、字符数组最后一个元素是'\0'
这也是用了malloc后需要free的原因吗?要不一直存在就浪费了。。
【 在 HFlyaway 的大作中提到: 】
: 这也是用了malloc后需要free的原因吗?要不一直存在就浪费了。。
正解。堆里面的东西 需要程序员自己处理、
看看进程空间就知道了,堆上分配的全局的,栈是系统管理的,会在退出函数以后被回收,而堆中分配的空间需要程序员显示释放,系统是不管的,所以在退出函数以后还是存在的