首页 分享 【C/C++】令人纠结的getMemory()函数(多种情况详细分析)

【C/C++】令人纠结的getMemory()函数(多种情况详细分析)

来源:花匠小妙招 时间:2025-05-13 18:44

如果你将面试一份C/C++的工作,那么无论是笔试题或者面试题都有极大可能会被问到getMemory()的问题。当然这也是一道比较纠结的题目,本文就对这几道题目来做一个分析对比。

题目一

void getMemory(char *p) { p=(char *)malloc(100); } void Test(void) { char *str=NULL; getMemory(str); strcpy(str,"hello world"); printf(str); } 123456789101112

运行结果:运行错误
解释:getMemory(char *p)中的函数参数是char *类型的,而传入函数的str的类型也是char *。这就导致了,调用getMemory(str);后,最终str的值还是NULL,在函数内部修改形参并不能真正改变传递进去的实参。简单一点说,要想改变一级指针,需要传递一级指针的地址,也就是二级指针。

题目二

char *getMemory(void) { char p[]="hello world"; return p; } void Test(void) { char *str=NULL; str=getMemory(); printf(str); } 123456789101112

运行结果:运行无误,但打印乱码
解释:getMemory(void)中的p[]为函数内的局部自动变量,在函数返回后,内存已经被释放。如果一步步调试,会发现执行str=getMenory();后str不再是NULL了,但是str的内容并不是hello world,而是垃圾数据。

题目三

void getMemory(char **p,int num) { *p=(char *)malloc(num); } void Test(void) { char *str=NULL; getMemory(&str,100); strcpy(str,"hello world"); printf(str); } 123456789101112

运行结果:运行正确,但有内存泄漏
解释:getMemory(char **p,int num)中的中的函数参数是char **p类型的,而传入函数的str的类型是char *。利用二级指针修改一级指针,没有问题。但是动态分配的内存并不会自动释放,容易有内存泄漏的风险。同时,没有测试是否成功分配了内存,应该有if(*p==NULL) { ……}之类的语句处理内存分配失败的其情况。

题目四

char* getMemory(int num) {char* p=(char*)malloc(num);return p; } void Test(void) {char* str=NULL;str=getMemory(100);strcpy(str,"hello world");printf(str); } 12345678910111213

运行结果:运行正确,但有内存泄漏
解释:注意题目五和题目二的区别。虽然都是局部变量,但题目五用函数返回值来传递动态内存的地址;而题目二return语句返回指向“栈”内存的指针,因为该内存在函数结束时自动消亡。同样,动态分配的内存并不会自动释放,容易有内存泄漏的风险。

题目五

char* getMemory(void) {char* p="hello world";return p; } void Test(void) {char* str=NULL;str=getMemory();printf(str); } 123456789101112

运行结果:运行正确,但不合理
解释:getMemory(void)中的中,p指向的是字符串常量,字符串常量保存在静态存储区。虽然Test(void)运行不会出错,但是函数getMemory(void)的设计概念却是错误的。因为getMemory(void)内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用getMemory(void),它返回的始终是同一个“只读”的内存块。例如,如想执行

p[0]='n'; 1

则程序会中断,并提示内存错误。

主要区分

1、栈中分配局部变量空间,是系统自动分配空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问;
2、堆区分配程序员申请的内存空间,堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露;
3、静态区是分配静态变量,全局变量空间的。

相关知识

C++做的玫瑰花
做题的心得与经验(C/C++)
常见C/C++ XML解析器比较
小伙子用C语言写出绽放的玫瑰花,成功表白C++代码女神!
ubuntu linux C/C++环境搭建
这道题是给使用C/C++语言的同学准备的。使用其他语言的同学,可能需要花点功夫思
C语言情人节玫瑰花代码
C C++最新华为机试
小白初学C++的引用
Python如何使用随机函数生成字符串?

网址: 【C/C++】令人纠结的getMemory()函数(多种情况详细分析) https://www.huajiangbk.com/newsview1947163.html

所属分类:花卉
上一篇: arm服务器上编译MongoDB
下一篇: 研发出市面上最高最壮的人形机器人

推荐分享