C内存相关的题目总结
来源:互联网 发布:淘宝新店装修教程 编辑:程序博客网 时间:2024/06/07 20:59
今天突然看到了一些C的内存相关的题目,貌似是曾今的面试题,发现自己确实还真没能完全理解,现在把自己整理好的想法写下来
(注意)经过请教和查资料,下面分析的可能不准确,
详细分析请看:点击连接
程序一:
void getMemory(char *p)
{
p=( char *)malloc(100);
}
int main()
{
char *str=NULL;
getMemory(str);
strcpy(str, "hello");
printf( "%s",str);
free(str);
return 0;
}
结果:崩溃。。。。相当于按值传递。。。。
【注意】程序最后一定要加上free(str),否则会造成内存泄漏。。。
改动:传递指针,
void getMemory(char **p)
{
*p=( char *)malloc(100);
}
int main()
{
char *str=NULL;
getMemory(&str);
strcpy(str, "hello");
printf( "%s",str);
free(str);
return 0;
}
结果正确...
程序二:
char * GetMemory()
{
char p[]="hello" ;
return p;
}
int main()
{
char *str = NULL;
str = GetMemory();
printf(str);
return 0;
}
结果:乱码。。。char p[] = "helloword",p指向一块内存,该内存中存的是“helloword”,在函数的栈中,函数结束后栈中的内存会被回收,再输出就是乱码。如果写成char *p = "hello",输出的就不是乱码。 关于这个题目 ,我觉得http://t.cn/zTbnSJg讲的挺好的
我的理解是:首先“hello”这个常量字符串肯定会存在静态数据区,用char *p,返回的是存在静态区的该串的指针,不会因为p被回收而消失(静态的哦),而用char p[],会有一份字符串存在静态,另一份存在栈中,返回的是存在栈中的指针,会被回收。
为了便于理解:如下
char str1[] = "abc";
char str2[] = "abc";//返回的存在栈中,所以str1和str2的不想等
char *str3 = "abc";
char *str4 = "abc";//静态区公用
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
结果是:0 1
- C内存相关的题目总结
- 相关比赛题目总结
- 一道C语言的内存管理题目
- C语言相关题目
- C、C++面试题目的总结
- 暑期练习——关于C语言的基础知识复习及相关题目解题技巧总结(1)
- jvm内存相关的知识总结
- C/C++与内存相关的函数
- C语言内存相关的一些知识点
- 二分查找相关题目总结
- [Leetcode]database 相关题目的总结
- C语言内存相关
- 概率相关的题目
- cocos2相关的题目
- 栈的相关题目
- 树的相关题目
- 超帅的C核心相关总结
- 内存相关(C/C++)基础知识
- java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊
- Delphi stdCall意义
- 安装Vuforia SDK
- WTL for MFC Programmers, Part II - WTL GUI Base Classes
- ios(一) OC基础
- C内存相关的题目总结
- struts2 备忘录
- 遇到问题
- 近邻成分分析(NCA)算法
- POJ 2318 TOYS 二分+叉积
- 多重panel的边框效果
- ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码:
- 【SGA】sga的物理分配
- 黑马程序员--方法参数传递的方式