C内存相关的题目总结
2013-10-24 22:23
453 查看
今天突然看到了一些C的内存相关的题目,貌似是曾今的面试题,发现自己确实还真没能完全理解,现在把自己整理好的想法写下来
[align=left](注意)经过请教和查资料,下面分析的可能不准确,[/align]
[align=left] 详细分析请看:点击连接[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
程序一:
[align=left]void getMemory(char *p)[/align]
[align=left]{[/align]
[align=left] p=( char *)malloc(100);[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]int main()[/align]
[align=left]{[/align]
[align=left] char *str=NULL;[/align]
[align=left] getMemory(str);[/align]
[align=left] strcpy(str, "hello");[/align]
[align=left] printf( "%s",str);[/align]
[align=left] free(str);[/align]
[align=left] return 0;[/align]
[align=left]}[/align]
结果:崩溃。。。。相当于按值传递。。。。
【注意】程序最后一定要加上free(str),否则会造成内存泄漏。。。
改动:传递指针,
[align=left]void getMemory(char **p)[/align]
[align=left]{[/align]
[align=left] *p=( char *)malloc(100);[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]int main()[/align]
[align=left]{[/align]
[align=left] char *str=NULL;[/align]
[align=left] getMemory(&str);[/align]
[align=left] strcpy(str, "hello");[/align]
[align=left] printf( "%s",str);[/align]
[align=left] free(str);[/align]
[align=left] return 0;[/align]
[align=left]}[/align]
结果正确...
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]程序二:[/align]
[align=left]char * GetMemory()[/align]
[align=left]{[/align]
[align=left] char p[]="hello" ;[/align]
[align=left] return p;[/align]
[align=left]}[/align]
[align=left]int main()[/align]
[align=left]{[/align]
char *str
= NULL;
[align=left] str = GetMemory();[/align]
[align=left] printf(str);[/align]
[align=left] return 0;[/align]
[align=left]}[/align]
结果:乱码。。。char p[]
= "helloword",p指向一块内存,该内存中存的是“helloword”,在函数的栈中,函数结束后栈中的内存会被回收,再输出就是乱码。如果写成char *p = "hello",输出的就不是乱码。
关于这个题目 ,我觉得http://t.cn/zTbnSJg讲的挺好的
[align=left]我的理解是:首先“hello”这个常量字符串肯定会存在静态数据区,用char *p,返回的是存在静态区的该串的指针,不会因为p被回收而消失(静态的哦),而用char p[],会有一份字符串存在静态,另一份存在栈中,返回的是存在栈中的指针,会被回收。[/align]
[align=left]为了便于理解:如下[/align]
[align=left]
[/align]
char str1[] = "abc";
char str2[] = "abc";//返回的存在栈中,所以str1和str2的不想等
char *str3 = "abc";
char *str4 = "abc";//静态区公用
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
结果是:0 1
[align=left](注意)经过请教和查资料,下面分析的可能不准确,[/align]
[align=left] 详细分析请看:点击连接[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
程序一:
[align=left]void getMemory(char *p)[/align]
[align=left]{[/align]
[align=left] p=( char *)malloc(100);[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]int main()[/align]
[align=left]{[/align]
[align=left] char *str=NULL;[/align]
[align=left] getMemory(str);[/align]
[align=left] strcpy(str, "hello");[/align]
[align=left] printf( "%s",str);[/align]
[align=left] free(str);[/align]
[align=left] return 0;[/align]
[align=left]}[/align]
结果:崩溃。。。。相当于按值传递。。。。
【注意】程序最后一定要加上free(str),否则会造成内存泄漏。。。
改动:传递指针,
[align=left]void getMemory(char **p)[/align]
[align=left]{[/align]
[align=left] *p=( char *)malloc(100);[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]int main()[/align]
[align=left]{[/align]
[align=left] char *str=NULL;[/align]
[align=left] getMemory(&str);[/align]
[align=left] strcpy(str, "hello");[/align]
[align=left] printf( "%s",str);[/align]
[align=left] free(str);[/align]
[align=left] return 0;[/align]
[align=left]}[/align]
结果正确...
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]程序二:[/align]
[align=left]char * GetMemory()[/align]
[align=left]{[/align]
[align=left] char p[]="hello" ;[/align]
[align=left] return p;[/align]
[align=left]}[/align]
[align=left]int main()[/align]
[align=left]{[/align]
char *str
= NULL;
[align=left] str = GetMemory();[/align]
[align=left] printf(str);[/align]
[align=left] return 0;[/align]
[align=left]}[/align]
结果:乱码。。。char p[]
= "helloword",p指向一块内存,该内存中存的是“helloword”,在函数的栈中,函数结束后栈中的内存会被回收,再输出就是乱码。如果写成char *p = "hello",输出的就不是乱码。
关于这个题目 ,我觉得http://t.cn/zTbnSJg讲的挺好的
[align=left]我的理解是:首先“hello”这个常量字符串肯定会存在静态数据区,用char *p,返回的是存在静态区的该串的指针,不会因为p被回收而消失(静态的哦),而用char p[],会有一份字符串存在静态,另一份存在栈中,返回的是存在栈中的指针,会被回收。[/align]
[align=left]为了便于理解:如下[/align]
[align=left]
[/align]
char str1[] = "abc";
char str2[] = "abc";//返回的存在栈中,所以str1和str2的不想等
char *str3 = "abc";
char *str4 = "abc";//静态区公用
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
结果是:0 1
相关文章推荐
- 【二叉树】常用处理与leetcode相关题目总结
- [Leetcode][位运算]相关题目汇总/分析/总结
- jvm内存相关的知识总结
- [Leetcode]database 相关题目的总结
- 内存泄漏相关内容总结(上)
- [Leetcode][求和问题2Sum/3Sum/4Sum/KSum]相关题目汇总/分析/总结
- IOS开发(49)之关于 self与内存相关的用法总结
- 关于 self与内存相关的用法总结
- 工程使用cocosBuilder后内存相关管理总结
- Polya定理相关题目解题方式总结(补轴上 有不变元素)
- SYBASE ASE 内存相关学习总结
- 二叉树相关面试题目之实例总结
- 【腾讯优测干货分享】如何降低App的待机内存(五)——优化dex相关内存及本章总结
- 与树相关的题目 树形DP 总结,不断汇总中
- 【总结】性能调优:JVM内存调优相关文章
- 相关比赛题目总结
- 二叉树相关题目总结
- [Leetcode][链表]相关题目汇总/分析/总结
- 二叉树相关面试题目总结
- hackerrank 和 leetcode的链表相关的题目的总结