- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
字符串存储方式以和静态存储区域、栈、堆
字符串的存储方式以及静态存储区域、栈、堆
2010-10-10 10:51 488 人阅读评论(4) 收藏举报
下面两篇文章分析得比较详细.转自
/yangdelong/archive/2010/04/03/5447362.aspx
文章来源/shiwei0124/archive/2009/11/26/4877546.aspx
字符串的存储方式以及静态存储区域、栈、堆
在编程的时候偶尔会遇到一个字符串的问题,好像是这样说:不能把 const char* 转换成
TCHAR * ,只是这个错误有时候有,有时候没有,也没有深入关注过,只知道 abc 应该
是一个const 型的。
今天偶然看到2 个帖子,终于对这个问题有了比较清晰的理解
贴一:
/u17/900b3797-3642-4569-a623-dc0f8ebd8401.html?see
d=1325371970
#include stdio.h
int A()
{
int test=10;
return test;
}
int main()
{
int a=A();
printf(%d/n,a);
return 0;
}
上面的代码能编译通过 我想问 在A() 函数中的 test 变量的生存期不是只在A()函数体内
吗? 怎么还能成功返回呢
下面的这段代码为何就不行呢 两个程序中的变量生存期有什么区别啊?
#include stdio.h
char* A()
{
char p[]=hello world;
return p;
}
int main()
{
char *str=NULL;
str=A();
printf(%s,str);
}
比较好的答案是:
一:
关键在这里:
int a=A();
实际是a=test;之后test 挂掉了,我们不管,反正有a.
而
str=A();
就是str=p.
之后p 跟p 指向的堆区都挂了,可是str 依然孤独地指向p 那片挂掉的堆区.
明白了不?
二:
注意
int A()
{
int test=10;
return test;
}
返回的是值, 的确调用完后test 会释放, 但它的值被返回了
而
char* A()
{
char p[]=hello world;
return p;
}
返回的是指针, 确切讲是指针的值, 但因为hello world会释放, 所以返回的这个指针值没
用了
(存放字符串的空间被释放掉了, 这个指针值还有什么用?)
然后在看第二帖:
/u10/8e6dfe37-b12f-410f-9e02-83eaad1c30a0.html?2569
2
问题:
先看贴
/u17/900b3797-3642-4569-a623-dc0f8ebd8401.html?see
d=1325371970
这个帖子里面斑竹回答的内容,感觉很深刻。正确。但是实验一下时候出现点问题
C/C++ code
char *FuncC()
{
char* a=hello word;
return a;
}
char *FuncB()
{
char a[]=hello word;
return a;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *b,*c;
c = FuncC();
b = FuncB();
char a[100];
::memset(a,NULL,100);
strcpy(a,c);
std::coutA=a B=b C =cendl;
getchar();
return 0;
}
输出结果:
C/C++ code
A=hello word B=p_/*(操作未知)*/ C=hello word;//我也认为C 结果也是未定义的,但是不管
怎么操作,结果都对啊
唯一不同的是 FuncB 中,返回的是局部指针数组的头指针,FuncC 中返回的是局部指针的
副本。他们都在编译时候确定大小,分
您可能关注的文档
- 多姿多采袋和包.ppt
- 多姿多彩袋和包.ppt
- 多尺度传热传质chapter 11.pdf
- 多彩汉子.ppt
- 多宝串知识-大全.doc
- 多模块综合的练习.doc
- 多民族大家庭一课时1.ppt
- 多电平变换器PWM调制的策略.pdf
- 多种细胞培养的方法.doc
- 多空因素交织 12月黄金料宽幅震荡.doc
- 数字货币在数字货币支付创新模式中的应用与2025年市场潜力研究报告.docx
- 数字货币在数字货币支付服务中的应用2025:现状与未来趋势报告.docx
- 新能源汽车电池回收环保产业投资风险与机遇分析报告.docx
- 构建航天装备产业标准化体系与质量控制.docx
- 教育数字化创新与国家教育强国战略.docx
- 数字货币在数字货币支付系统的安全性分析研究报告.docx
- 构建和谐社会中的学校和社区互动模式.docx
- 2025年药品智能制造技术应用与生产效率优化研究报告.docx
- 聚焦2025:跨境电商物流企业网络布局与物流技术创新应用趋势报告.docx
- 辉瑞-BioNTech疫苗研发合作:产业链协同效应分析.docx
文档评论(0)