字符串地存储方式以及静态存储区域、栈、堆.pdfVIP

  • 0
  • 0
  • 约6.94千字
  • 约 11页
  • 2017-09-21 发布于上海
  • 举报

字符串地存储方式以及静态存储区域、栈、堆.pdf

字符串的存储方式以及静态存储区域、栈、堆 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 中返回的是局部指针的 副本。他们都在编译时候确定大小,分

文档评论(0)

1亿VIP精品文档

相关文档