博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于在函数中返回动态的内存
阅读量:7222 次
发布时间:2019-06-29

本文共 1118 字,大约阅读时间需要 3 分钟。

hot3.png

1 #include 
2 using namespace std; 3 4 void GetMemeory(char* p) 5 { 6 p=(char*)malloc(sizeof(char)*100); 7 } 8 9 int main()10 {11 char *str=NULL;12 GetMemeory(str);13 strcpy(str,"Thunder");14 strcat(str,"Downloader");15 printf(str);16 system("pause");17 return 0;18 }

我们期望的输出是:ThunderDownloader

然而当我们运行此段代码的时候发现,程序崩溃了。

 

其实我们深入分析下不难发现,当我们传入str到GetMemeory()函数中的时候,该函数我们创建了一个临时

的指针变量片p,然后将其指向NULL。然后我们为临时指针变量p动态分配内存,注意,当我们在返回的时候

整个临时指针变量是释放掉的,因为其内存是在栈内存中分配的。但是我们之前传入的str的内存地址与临时变量

的内存地址是不相同的。所以此时str不能获取在函数GetMemmory分配的内存,因此后面的字符串复制和链接操作

都将造成程序崩溃。

假设str本身内存为0x123  临时指针变量p的内存为0x456  动态分配的内存起始地址为0x789

当GetMemory函数结束的时候p被释放,而再也无指针指向这块动态分配的内存了。另外str也不可能

获取这段动态分配的内存的地址。所以也造成了内存泄露。

我们可以用如下两种方法解决这一问题:

一种是二级指针:

 

1 #include 
2 using namespace std; 3 4 void GetMemeory(char** p) 5 { 6 (*p)=(char*)malloc(sizeof(char)*100); 7 } 8 9 int main()10 {11 char *str=NULL;12 GetMemeory(&str);13 strcpy(str,"Thunder");14 strcat(str,"Downloader");15 printf(str);16 system("pause");17 return 0;18 }

 

 

 

转载于:https://my.oschina.net/floristgao/blog/1809708

你可能感兴趣的文章
KMP字符串匹配 简单理解
查看>>
大话设计模式C++版——代理模式
查看>>
Tri Tiling(hdu1143)
查看>>
Android App 隐藏标题栏+状态栏+导航栏
查看>>
架构师速成-怎样高效编程
查看>>
vue生命周期的栗子
查看>>
C语言使用以及其它语言经常出的错误
查看>>
Zookeeper运维小结--CancelledKeyException
查看>>
据库索引及其数据结构
查看>>
UWP平台Taglib编译(2)
查看>>
POJ 2104(K-th Number-区间第k大-主席树)
查看>>
HDOJ 2689
查看>>
[置顶] js综合应用:表格的四则运算
查看>>
SQLServer 2008 :error 40 出现连接错误
查看>>
c++如何遍历删除map/vector里面的元素
查看>>
VS2013 单元测试(使用VS2013自带的单元测试)
查看>>
git add --all 为啥不能添加空文件夹,这样设计的初衷是
查看>>
Linux find/grep命令
查看>>
【数据结构与算法】(二) c 语言链表的简单操作
查看>>
单片机地址扩展后
查看>>