对通过函数申请内存的理解
来源:互联网 发布:企业网络公关 编辑:程序博客网 时间:2024/06/05 21:54
如果想通过函数申请一块内存并将这块内存地址传递出来,需要用到指针的指针,但是在这一块并不是很好理解。虽然不知道自己的想法是不是正确的,但是很好理解,先做一个笔记,免得忘记。
void GetMemory1(char *p,int num){ p=malloc(sizeof(int)*num); return;} void Test1(){ char *p=NULL; GetMemory(p);}
比如这个代码,想要在GetMemory1函数中申请内存并由参数p带出来。由于函数的调用会生成参数的副本,即使你将函数参数的值改变,也无法将这个改变的值保持到函数结束后,即调用函数后,这个参数的值本身还是不会发生改变。在GetMemory1函数中,试图修改p的副本_p的值,而不是_p所指向的内存的值,所以p的值实际无法改变。
正确的做法如下:
void GetMemory2(char **p,int num){ * p=malloc(sizeof(int)*num); return;} void Test2(){ char *p=NULL; GetMemory2(&p);}
因为我们要将函数中申请的内存传递给指针p,但是我们又不能在函数中直接对p进行内存地址的赋值,那么我们可以通过修改存储指针p的内容来改变指针p所在内存地址的内容来间接改变指针p的值。
p作为一个指针,虽然是用来存储其他变量的内存地址,但是显然,p本身作为一个变量,也是需要内存空间来存储的。比如
int a=5;
int *f=&a;
假设变量a的内存地址为0xa,那么f存储的就是0xa,那么存储f的内存地址呢,那就是&f。
而&f是固定的,那么我们通过直接修改&f所在内存地址,那么f所指向的地址内容就会发生变化。
回到GetMemory2函数,因为p作为一个指针,而对指针取地址符,那么就是指针的指针,所以在函数的参数上面就是char** p,而这里面的p就是GetMemory2(&p)中的&p。
调用我觉得这样写更好理解,或者char* *p,表示指向*p的一个指针。这样的函数调用,实际上就是修改p所在内存空间的值,而不是修改其副本的值。
个人这样理解感觉很简单,虽然不知道正不正确。
阅读全文
0 0
- 对通过函数申请内存的理解
- 申请内存的函数
- __GFP_DIRECT_RECLAIM 对smmu申请memory的函数是申请物理不连续的内存?
- 通过函数申请内存的两个函数剖析(malloc函数讲解)
- 对通过拷贝构造函数对 对象初始化的理解
- 通过函数给指针申请内存时遇到的内存泄漏问题
- 通过代码分析得到一些对虚函数的 理解
- 利用函数申请内存的几个问题
- linux内核常用的内存申请函数
- 内核的几个内存动态申请函数
- C内存申请函数
- 内存申请函数
- 函数动态申请内存
- C申请内存函数
- 对java内存的理解
- [指针四] 通过函数进行动态内存申请---二级指针、函数返回值
- 练习3: 通过打印指针,加深对交换函数和指针的理解。
- 通过函数分配内存,理解实参,形参之间的传递.
- jdbc连接Oracle示例
- 单机安装spark
- I2C接口
- 零基础学seo教程并非易事
- 再谈Docker容器单机网络:利用iptables trace和ebtables log
- 对通过函数申请内存的理解
- 关于Java工程的资源目录
- 研究生手册(二)
- CodeForces 699C
- 开发一个井字游戏
- 面向对象开发公众号,php代码封装类,函数
- JQuery源码解析–extend篇
- 给定一个没有重复数的数组。建立一棵最大树
- pandas之get_dummies