欢迎来到天天文库
浏览记录
ID:1237005
大小:235.97 KB
页数:11页
时间:2017-11-09
《字符串的存储方式以及静态存储区域、栈、堆》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、字符串的存储方式以及静态存储区域、栈、堆2010-10-1010:51488人阅读评论(4)收藏举报下面两篇文章分析得比较详细.转自http://blog.csdn.net/yangdelong/archive/2010/04/03/5447362.aspx文章来源http://blog.csdn.net/shiwei0124/archive/2009/11/26/4877546.aspx字符串的存储方式以及静态存储区域、栈、堆在编程的时候偶尔会遇到一个字符串的问题,好像是这样说:不能把constchar*
2、转换成TCHAR*,只是这个错误有时候有,有时候没有,也没有深入关注过,只知道"abc"应该是一个const型的。今天偶然看到2个帖子,终于对这个问题有了比较清晰的理解贴一:http://topic.csdn.net/u/20090302/17/900b3797-3642-4569-a623-dc0f8ebd8401.html?seed=1325371970#includeintA(){inttest=10;returntest;}intmain(){inta=A();printf("%d
3、/n",a);return0;}上面的代码能编译通过我想问在A()函数中的test变量的生存期不是只在A()函数体内吗?怎么还能成功返回呢下面的这段代码为何就不行呢两个程序中的变量生存期有什么区别啊?#includechar*A(){charp[]="helloworld";returnp;}intmain(){char*str=NULL;str=A();printf("%s",str);}比较好的答案是:一:关键在这里:inta=A();实际是a=test;之后test挂掉了,我们不管,
4、反正有a.而str=A();就是str=p.之后p跟p指向的堆区都挂了,可是str依然孤独地指向p那片挂掉的堆区.明白了不?二:注意intA(){inttest=10;returntest;}返回的是值,的确调用完后test会释放,但它的值被返回了而char*A(){charp[]="helloworld";returnp;}返回的是指针,确切讲是指针的值,但因为"helloworld"会释放,所以返回的这个指针值没用了(存放字符串的空间被释放掉了,这个指针值还有什么用?)然后在看第二帖:http://to
5、pic.csdn.net/u/20091126/10/8e6dfe37-b12f-410f-9e02-83eaad1c30a0.html?25692问题:先看贴http://topic.csdn.net/u/20090302/17/900b3797-3642-4569-a623-dc0f8ebd8401.html?seed=1325371970这个帖子里面斑竹回答的内容,感觉很深刻。正确。但是实验一下时候出现点问题C/C++codechar*FuncC(){char*a="helloword";return
6、a;}char*FuncB(){chara[]="helloword";returna;}int_tmain(intargc,_TCHAR*argv[]){char*b,*c;c=FuncC();b=FuncB();chara[100];::memset(a,NULL,100);strcpy(a,c);std::cout<<"A="<7、elloword;//我也认为C结果也是未定义的,但是不管怎么操作,结果都对啊唯一不同的是FuncB中,返回的是局部指针数组的头指针,FuncC中返回的是局部指针的副本。他们都在编译时候确定大小,分配空间,他们都指向的是字符串常量。为啥FuncB失败。FuncC就成功呢。还是,还是说,结果未知,即使输出正确,。。回答:一:不知道楼主对栈,堆,静态区了解多少,FuncC中,char*a="helloword";a并没有分配空间,而是"helloword"这个串放在了静态区(和全局变量一个级别),放在栈中的只是8、指针a(4个字节的指针),函数返回后,销毁的也只是a,静态区的串是不会销毁的c=FuncC();虽然a被销毁了,但c接收了返回值,依然指向静态区的串"helloword"所以是没有问题的相反的FuncB()中chara[]="helloword";整个串都是放在栈中的,函数返回时被销毁了,结果未知。二:FuncA的做法返回的是一个指针,这个指针指向的是静态数据区,函数返回时得到这个指针的拷贝,其指向的位置仍是静态
7、elloword;//我也认为C结果也是未定义的,但是不管怎么操作,结果都对啊唯一不同的是FuncB中,返回的是局部指针数组的头指针,FuncC中返回的是局部指针的副本。他们都在编译时候确定大小,分配空间,他们都指向的是字符串常量。为啥FuncB失败。FuncC就成功呢。还是,还是说,结果未知,即使输出正确,。。回答:一:不知道楼主对栈,堆,静态区了解多少,FuncC中,char*a="helloword";a并没有分配空间,而是"helloword"这个串放在了静态区(和全局变量一个级别),放在栈中的只是
8、指针a(4个字节的指针),函数返回后,销毁的也只是a,静态区的串是不会销毁的c=FuncC();虽然a被销毁了,但c接收了返回值,依然指向静态区的串"helloword"所以是没有问题的相反的FuncB()中chara[]="helloword";整个串都是放在栈中的,函数返回时被销毁了,结果未知。二:FuncA的做法返回的是一个指针,这个指针指向的是静态数据区,函数返回时得到这个指针的拷贝,其指向的位置仍是静态
此文档下载收益归作者所有