【求助】子函数定义一个字符串变量,返回指针。由数组和指针定义而出现的不同现象,挺有趣的!!

孤傲猎人 2017-10-30 07:30:32
#include <iostream>
#include <cstdio>
using namespace std;
char *func( )
{
char *s="abcde";
return s;
}
char *func2( )
{
char s[]="abcde";
return s;
}

int main()
{
char *str=NULL,*str2=NULL;
str=func();
cout<<str<<endl;
str2=func2();
cout<<str2<<endl;

return 0;
}


偶然间发现了一个非常有趣的现象,正常来说,函数funuc2()的运用是错误的,数组s是局部变量,内存中的位置应该是堆栈,该函数结束后,分配的内存收回,此时运行cout<<str2<<endl得到的是乱码,调试的结果也验证了这一点。
但是函数func()运行后,再运行语句cout<<str<<endl;得到确是“abcde”。。。。。s虽然是指针,但也是一个局部变量,函数func()结束后,其内存难道没有释放吗?小弟没有想明白,敬请各位同仁指导,谢谢啦!!附上运行结果图。
...全文
181 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-10-31
  • 打赏
  • 举报
回复
栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时,会自动执行其析构函数,…… 其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。 http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
自信男孩 2017-10-31
  • 打赏
  • 举报
回复
返回局部变量数组是未定义行为,如果能够得到正确的值,那么说明释放的函数空间没有被申请,数据自然没有被覆盖。
赵4老师 2017-10-31
  • 打赏
  • 举报
回复
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
Intel0011 2017-10-31
  • 打赏
  • 举报
回复
char *s="abcde";
这种方式定义的字符串"abcde"在常量区,即s指向常量区,所以返回的是常量区的地址,常量区的内容是不会变化的
孤傲猎人 2017-10-31
  • 打赏
  • 举报
回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧