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

上传人:mg****85 文档编号:44618350 上传时间:2018-06-14 格式:PDF 页数:11 大小:235.97KB
返回 下载 相关 举报
字符串的存储方式以及静态存储区域、栈、堆_第1页
第1页 / 共11页
字符串的存储方式以及静态存储区域、栈、堆_第2页
第2页 / 共11页
字符串的存储方式以及静态存储区域、栈、堆_第3页
第3页 / 共11页
字符串的存储方式以及静态存储区域、栈、堆_第4页
第4页 / 共11页
字符串的存储方式以及静态存储区域、栈、堆_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《字符串的存储方式以及静态存储区域、栈、堆》由会员分享,可在线阅读,更多相关《字符串的存储方式以及静态存储区域、栈、堆(11页珍藏版)》请在金锄头文库上搜索。

1、字符串的存储方式以及静态存储区域、栈、堆 2010-10-10 10:51 488 人阅读 评论(4) 收藏 举报 下面两篇文章分析得比较详细.转自http:/ 文章来源 http:/ 字符串的存储方式以及静态存储区域、栈、堆 在编程的时候偶尔会遇到一个字符串的问题,好像是这样说:不能把 const char* 转换成 TCHAR * ,只是这个错误有时候有,有时候没有,也没有深入关注过,只知道 “abc“ 应该是一个 const 型的。 今天偶然看到 2 个帖子,终于对这个问题有了比较清晰的理解 贴一: http:/ #include int A() int test=10; return

2、test; int main() int a=A(); printf(“%d/n“,a); return 0; 上面的代码能编译通过 我想问 在 A() 函数中的 test 变量的生存期不是只在 A()函数体内吗? 怎么还能成功返回呢 下面的这段代码为何就不行呢 两个程序中的变量生存期有什么区别啊? #include char* A() char p=“hello world“; return p; int main() char *str=NULL; str=A(); printf(“%s“,str); 比较好的答案是: 一: 关键在这里: int a=A(); 实际是 a=test;之后

3、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“会释放, 所以返回的这个指针值没用了 (存放字符串的空间被释放掉了, 这个指针值还有什么用?) 然后在看第二帖:

4、http:/ 问题: 先看贴http:/ 这个帖子里面斑竹回答的内容,感觉很深刻。正确。但是实验一下时候出现点问题 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 a100; :memset(a,NULL,100); strcpy(a,c); std:cout char *returnSt

5、r() char *p=“hello world!“; return p; int main() char *str=NULL;/一定要初始化,好习惯 str=returnStr(); printf(“%s/n“, str); return 0; 这个没有任何问题,因为“hello world!“是一个字符串常量,存放在静态数据区, 把该字符串常量存放的静态数据区的首地址赋值给了指针, 所以 returnStr 函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。 但是,下面的就有问题: #include char *returnStr() char p=“hello

6、world!“; return p; int main() char *str=NULL;/一定要初始化,好习惯 str=returnStr(); printf(“%s/n“, str); return 0; “hello world!“是一个字符串常量,存放在静态数据区,没错, 但是把一个字符串常量赋值给了一个局部变量(char 型数组),该局部变量存放在栈中, 这样就有两块内容一样的内存,也就是说“char p=“hello world!“;”这条语句让“hello world!”这个字符串在内存中有两份拷贝,一份在动态分配的栈中,另一份在静态存储区。这是与前者最本质的区别, 当 retu

7、rnStr 函数退出时,栈要清空,局部变量的内存也被清空了, 所以这时的函数返回的是一个已被释放的内存地址,所以打印出来的是乱码。 如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为 static 类型。如下: #include char *returnStr() static char p=“hello world!“; return p; int main() char *str=NULL; str=returnStr(); printf(“%s/n“, str); return 0; 这个问题可以通过下面的一个例子来更好的说明: #include /返回的是局部变量的地

8、址,该地址位于动态数据区,栈里 char *s1() char* p1 = “qqq“;/为了测试char p=“Hello world!“中的字符串在静态存储区是否也有一份拷贝 char p=“Hello world!“; char* p2 = “w“;/为了测试char p=“Hello world!“中的字符串在静态存储区是否也有一份拷贝 printf(“in s1 p=%p/n“, p); printf(“in s1 p1=%p/n“, p1); printf(“in s1: strings address: %p/n“, printf(“in s1 p2=%p/n“, p2); re

9、turn p; /返回的是字符串常量的地址,该地址位于静态数据区 char *s2() char *q=“Hello world!“; printf(“in s2 q=%p/n“, q); printf(“in s2: strings address: %p/n“, return q; /返回的是静态局部变量的地址,该地址位于静态数据区 char *s3() static char r=“Hello world!“; printf(“in s3 r=%p/n“, r); printf(“in s3: strings address: %p/n“, return r; int main() ch

10、ar *t1, *t2, *t3; t1=s1(); t2=s2(); t3=s3(); printf(“in main:“); printf(“p=%p, q=%p, r=%p/n“, t1, t2, t3); printf(“%s/n“, t1); printf(“%s/n“, t2); printf(“%s/n“, t3); return 0; 运行输出结果: in s1 p=0013FF0C in s1 p1=00431084 in s1: strings address: 00431074 in s1 p2=00431070 in s2 q=00431074 in s2: strin

11、gs address: 00431074 in s3 r=00434DC0 in s3: strings address: 00431074 in main:p=0013FF0C, q=00431074, r=00434DC0 $ Hello world! Hello world! 这个结果正好应证了上面解释,同时,还可是得出一个结论: 字符串常量,之所以称之为常量,因为它可一看作是一个没有命名的字符串且为常量,存放在静态数据区。 这里说的静态数据区,是相对于堆、栈等动态数据区而言的。 静态数据区存放的是全局变量和静态变量, 从这一点上来说, 字符串常量又可以称之为一个无名的静态变量, 因为“Hello world!“这个字符串在函数 s1 和 s2 中都引用了,但在内存中却只有一份拷贝,这与静态变量性质相当神似。 本文来自 CSDN 博客,转载请标明出处:http:/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号