如题所示,我们主要讨论在自定义的内存分配函数中通常见到的代码如下所示:

void Create(A** addr);

其中传递的参数是二级指针。为什么?

我们先看一下完整的动态内存分配函数的简单例子:

struct A {
int a = 0;
int b = 0;
int c[3];
}; void Create(A** addr) {
printf("a1: %p\n", addr);
*addr = new A();
printf("a2: %p\n", addr);
} int main() {
A *a;
printf("a0: %p\n", a);
Create(&a); // 传递二级指针值
printf("a4: %p\n", a);
return 0;
}

我们看下函数运行结果:

我们看到传进去的*a的值改变了,而且这个改变作用到了*a本身

在看下我们一般情况下想到的分配方式:

struct A {
int a = 0;
int b = 0;
int c[3];
}; void Create(A* addr) {
printf("a1: %p\n", addr);
addr = new A();
printf("a2: %p\n", addr);
} int main() {
A *a = nullptr;
printf("a0: %p\n", a);
Create(a); 传进去指针本身
printf("a4: %p\n", a);
return 0;
}

同时我们在看下结果:

我们看到对指针的操作,并没有作用到指针本身。这是因为哪怕我们传进去的是个指针,但是还是以值传递的方式传递指针的值。

具体的过程是,我们在*a传递到函数里面时,函数自身创建了一个中间变量,我们姑且称他为temp,这个temp的值为 a,我们后面进行new之后也只是简单的将

分配后的内存地址给了temp,所以才会出现上面结果。

但是对于二级指针而言,传进去的是指针的地址,对指针地址所指值进行操作,当然会改变指针本身的值。

其实该种方式也可以等价于:

struct A {
int a = 0;
int b = 0;
int c[3];
}; void Create(A* &addr) {
printf("a1: %p\n", addr);
addr = new A();
printf("a2: %p\n", addr);
} int main() {
A *a;
printf("a0: %p\n", a);
Create(a);
printf("a4: %p\n", a);
return 0;
}

结果如下所示:

我们传进去的是指针的引用,当然会作用到指针本身。

C++ 有关指针作为函数参数的问题,自定义内存分配函数传递二级指针的问题的更多相关文章

  1. C标准库-数值字符串转换与内存分配函数

    原文链接:http://www.orlion.ga/977/ 一.数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); dou ...

  2. Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)

    Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc) 来源:http://blog.csdn.net/chunyexiyu/article/ ...

  3. C语言之内存分配函数

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { /********* ...

  4. 内存分配函数malloc、realloc、calloc、_alloca

    1.内存分配函数_alloca.malloc.realloc.calloc: _alloca 函数原型void * __cdecl _alloca(size_t); 头文件:malloc.h _all ...

  5. 【转】【C/C++】内存分配函数:malloc,calloc,realloc,_alloca

    转自:http://www.cnblogs.com/particle/archive/2012/09/01/2667034.html#commentform malloc: 原型:extern voi ...

  6. Linux内核中常见内存分配函数(二)

    常用内存分配函数 __get_free_pages unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order) __get_f ...

  7. Linux内核中常见内存分配函数【转】

    转自:http://blog.csdn.net/wzhwho/article/details/4996510 1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页 ...

  8. Linux内核中常见内存分配函数

    1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...

  9. C语言内存分配函数malloc——————【Badboy】

    C语言中经常使用的内存分配函数有malloc.calloc和realloc等三个,当中.最经常使用的肯定是malloc,这里简单说一下这三者的差别和联系. 1.声明 这三个函数都在stdlib.h库文 ...

随机推荐

  1. Android自定控件基础(一)——几何图形绘制

    虽然本人有几年开发经验,但是自定义控件这一块儿,研究的很少,惭愧--用到的时候就是百度查找,复制粘贴.工时紧,总是想的快点完工就好.(都是借口啦,想学总会有时间哒) 作为一个Android开发 要说自 ...

  2. UNP——第二章,TCP握手与挥手分析

    1.握手 说明: 下面涉及 FIN,SYN,ACK之类数据时,都是由TCP服务收发, 涉及 accept, listen 之类api,都是 应用进程 完成. 都统一使用 客户端,服务端描述,请自行分辨 ...

  3. 加解密 C语言实现

    1.加密的基本原理 加密分为对称加密和非对称加密,对称加密就是加密方和解密放用同一个密钥. 加密是分组加密,即将明文数据分成多个密钥大小的块,依次和密钥运算,输出密文. padding,由于加密需要分 ...

  4. rpm命令介绍

    rpm安装不能指定安装位置. 查看系统安装了哪些软件:rpm -qa  rpm -qa |grep keyword      (q:query  a 是all)   查看软件是否安装: rpm -q  ...

  5. ceph的df容量显示计算

    显示数据 [root@lab201 ~]# ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 1092T 404T 688T 63.01% POOLS: NA ...

  6. Python_案例_斐波那契数

    方法一: 1 #!/usr/bin/python3 2 3 # Fibonacci series: 斐波纳契数列 4 # 两个元素的总和确定了下一个数 5 a, b = 0, 1 6 while b ...

  7. Javaweb项目页面实时显示后台处理结果

    http://www.cnblogs.com/dong-xu/p/6701271.html 此博文甚好,项目参照博主代码可实现. 前端页面: <%@ page language="ja ...

  8. Hadoop大数据平台节点的动态增删

    环境:CentOS 7.4 (1708  DVD) 工具:MobaXterm 一. 节点的动态增加 1. 为新增加的节点(主机)配置免密码登录.使用ssh-keygen和ssh-copy-id命令(详 ...

  9. 去年去阿里面试,被问到java 多线程,我是这样手撕面试官的

    1.多线程的基本概念 1.1进程与线程 程序:是为完成特定任务,用某种语言编写的一组指令的集合,即一段静态代码,静态对象. 进程:是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程,每个程 ...

  10. CorelDRAW 里面如何将文字调整成半透明的颜色

    早在几年前,平面设计师在做设计时会遇到关于印刷的难题,那就是为了降低印刷成本,必须减少他们的颜色数量.随着印刷方法的进步,特别是数字出版物的兴起,我们生活在一个主要是通过屏幕观看图形的时代,一个可以显 ...