时间:2021-05-19
1、有以下题目:
#include <iostream>using namespace std;void GetMemeory(char* p){ p=(char*)malloc(sizeof(char)*100);}int main(){ char *str=NULL; GetMemeory(str); strcpy(str,"Thunder"); strcat(str,"Downloader"); printf(str); system("pause"); return 0;}我们期望的输出是:ThunderDownloader
然而当我们运行此段代码的时候发现,程序崩溃了。
其实我们深入分析下不难发现,当我们传入str到GetMemeory()函数中的时候,该函数我们创建了一个临时
的指针变量片p,然后将其指向NULL。然后我们为临时指针变量p动态分配内存,注意,当我们在返回的时候
整个临时指针变量是释放掉的,因为其内存是在栈内存中分配的。但是我们之前传入的str的内存地址与临时变量
的内存地址是不相同的。所以此时str不能获取在函数GetMemmory分配的内存,因此后面的字符串复制和链接操作
都将造成程序崩溃。
我们可以用下面的图形更加生动的这一过程:
:
假设str本身内存为0x123 临时指针变量p的内存为0x456 动态分配的内存起始地址为0x789
当GetMemory函数结束的时候p被释放,而再也无指针指向这块动态分配的内存了。另外str也不可能
获取这段动态分配的内存的地址。所以也造成了内存泄露。
我们可以用如下两种方法解决这一问题:
一种是二级指针:
#include <iostream>using namespace std;void GetMemeory(char** p){ (*p)=(char*)malloc(sizeof(char)*100);}int main(){ char *str=NULL; GetMemeory(&str); strcpy(str,"Thunder"); strcat(str,"Downloader"); printf(str); system("pause"); return 0;}运行截图为:
关于二级指针的方法可以参考如下的流程图:
一种是指针的引用方法:
#include <iostream>using namespace std;void GetMemeory(char*& p){ p=(char*)malloc(sizeof(char)*100);}int main(){ char *str=NULL; GetMemeory(str); strcpy(str,"Thunder"); strcat(str,"Downloader"); printf(str); system("pause"); return 0;}运行截图:
关于指针引用方法的流程图如下:
能力有限,难免有没说清楚的地方,还望包涵。
以上就是小编为大家带来的浅谈在函数中返回动态的内存全部内容了,希望大家多多支持~
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
继承和动态内存分配假设基类使用了动态内存分配,而且定义了析构函数、复制构造函数和赋值函数,但是在派生类中没有使用动态内存分配,那么在派生类中不需要显示定义析构函
C语言malloc()函数:动态分配内存空间头文件:#includemalloc()函数用来动态地分配内存空间(如果你不了解动态内存分配,请查看:C语言动态内存
C语言动态内存分配的详解1.为什么使用动态内存分配数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题。2.malloc和freeC函数库提供了两
C语言free()函数:释放动态分配的内存空间头文件:#includefree()函数用来释放动态分配的内存空间,其原型为:voidfree(void*ptr)
PHP内置函数memory_get_usage()能返回当前分配给PHP脚本的内存量,单位是字节(byte)。在WEB实际开发中,这些函数非常有用,我们可以使用