关于在函数中返回动态的内存

1.有以下题目:

 1 #include <iostream>
 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 <iostream>
 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 }

运行截图为:

关于二级指针的方法可以参考如下的流程图:

一种是指针的引用方法:

 1 #include <iostream>
 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 }

运行截图:

关于指针引用方法的流程图如下:

能力有限,难免有没说清楚的地方,还望包涵。

时间: 2024-11-05 19:05:19

关于在函数中返回动态的内存的相关文章

C++ 函数中返回字符串的一个陷阱

1 #include<iostream> 2 using namespace std; 3 char * getname(void); 4 int main() 5 { 6 char * name; 7 name = getname(); 8 cout << "My name is : " << name << endl; 9 cout << "---------华丽的分割线----------" <

function(函数)中的动态参数

我们可向函数传递动态参数,*args,**kwargs,首先我们来看*args,示例如下:     1.show(*args) def show(*args): print(args,type(args))    #以元组的形式向列表传递参数 show(11,22,33,44,55,66) 首先我们定义了一个函数,函数show(*args)里面的*args可以接收动态参数,这里我们接收一个元组形式的参数,我们可以向show()里面传递很多参数,函数默认把这些参数作为一个元组进行接收.     2

python函数中的动态参数

1.一级指针(*)动态参数一 在python中一个*表示将参数变成一个元组,可以接收多个参数 2.二级指针(**)动态参数二 在python中两个*表示将参数变成一个字典,在传值的时候必须是一对一对(键值对)的传,也可接收多个键值对 3.一级和二级混用时(万能参数) 在python中函数参数中包含一级和二级时,一级必须放到二级的前面 eg:f(p, *a, **b),不能写成f(p, **b, *a) 原文地址:https://www.cnblogs.com/oliverlucqut/p/887

单个回调函数中返回多个Request以及Item

import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = 'example.com' allowed_domains = ['example.com'] start_urls = [ 'http://www.example.com/1.html', 'http://www.example.com/2.html', 'http://www.example.com/3.html', ]

JS 函数中返回另一个函数

function createComparisonFunction(propertyName) { return function (object1, object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return

动态开内存malloc与calloc

malloc与calloc 1.函数原型 #include<stdlib.h> void *malloc(unsigned int size);     //申请size字节的内存 void *calloc(unsigned int num, unsigned size);    //申请num*size字节的内存 2.函数的返回值为void*类型,使用时需强制转换为所需要的类型: 如果内存申请失败,则返回NULL,所以使用申请到的内存时需要先进行判断. 如:char* p = (char*)

C语言函数不能返回数组,但可以返回结构体

为什么C语言函数可以返回结构体,却不可以返回数组?有这样的问题并不奇怪,因为C语言数组和结构体本质上都是管理一块内存,那为何编译器要区别对待二者呢? C语言函数为什么不能返回数组? 在C语言程序开发中,我们不可以编写下面这样的代码: char f(void)[8] { char ret; // ...fill... return ret; } int main(int argc, char ** argv) { char obj_a[10]; obj_a = f(); } ? 这其实就是不能在C

三种方法实现从“一个(组)查询过程中返回两个表的查询结果”

还记得開始做机房的时候,遇到了要从一个函数中返回两个表的查询结果.当时的解决方法非常"冲动"也非常"无拘无束",直接在实体类里边加入了其它表的实体,效果是达到了,但总认为不伦不类. 如今介绍三种解决上述问题的方法(代码为VB.net.系统使用三层架构). 题设要求:如果我如今要从卡表和学生表里返回查询信息(卡表的comment,money,status和学生表的所有信息),卡表和学生表例如以下: 图一  学生表 图二    卡表 方法一:视图. 比較简单,相信这样的

函数中多个return的不同实现形式

return 的作用 一.返回一个值给函数,主函数调用这个函数后能得到这个返回的值.二.结束函数,例如你运行到一个地方,虽然后面还有代码但是你不想再继续运行,这时就可以直接用 return:这条语句来结束函数. 两种实现 if, return 实现 do{}while(false); 实现 if, return 实现 int if_return_func() { result = 0; if (condition1) { return result1; } if (condition2) { r