文档章节

动态内存分配的传递

follitude
 follitude
发布于 2016/05/16 11:09
字数 581
阅读 51
收藏 2

#include <stdio.h>
#include <stdlib.h>
//Three methods to return the memory area allocated by malloc

第一种方法:
返回所分配内存的首地址,将首地址强制转换为int或long保存。在以后调用中,将该数值转换为所需类型对应的指针类型
int alloc_mem_1(int num)
{
    int *q;

    q = (int *) malloc(num);
    return (int) q;
}

第二种方法:
类似于第一种方法,只是将内存首地址转换为int或long保存在指针中。以后调用传递变量时,可以将一个int或long变量取址传递即可。

void alloc_mem_2(int *p, int num)
{
    int *q;

    q = (int *) malloc(num);
    *p = (int) q;
}

第三种方法:
使用指向指针的指针保存分配存储内存的首地址。

void alloc_mem_3(int **p, int num)
{
    *p = (int *) malloc(num);
}


int main(void)
{
    int i;
    int handle;

    /*three pointers to test three methods*/
    int *p1 = NULL;
    int *p2 = NULL;
    int *p3 = NULL;

    /*test of alloc_mem_1()*/
    printf("1: test of alloc_mem_1()\n");
    handle = alloc_mem_1(10 * sizeof(int));
    p1 = (int *)handle;
    for (i = 0; i < 10; i++){
        *(p1 + i) = i ;
        printf("%d\t", p1[i]);
    }

    printf("\n");
    free(p1);

    /*test of alloc_mem_2()*/
    printf("2: test of alloc_mem_2()\n");
    alloc_mem_2(&handle, 10 * sizeof(int));
    p2 = (int *)handle;
    for (i = 0; i < 10; i++){
        p2[i] = i * 2;
        printf("%d\t", p2[i]);
    }

    printf("\n");
    free(p2);

    /*test of alloc_mem_3()*/
    printf("3: test of alloc_mem_3()\n");
    alloc_mem_3(&p3, 10 * sizeof(int));
    for (i = 0; i < 10; i++){
        p3[i] = i * 3;
        printf("%d\t", p3[i]);
    }

    printf("\n");
    free(p3); 

    return 0;
}


其中:
1.第一种方法是采用返回值的方式,将所分配的内存的首地址以整型之返回。在调用该函数时,将其返回值强制转换为相应类型的指针即可,上例中是转换为整型指针。然后就可以以该内存为首地址,进行读写num个整形数据;
2.第二种方法的实现类似于第一种,只是将所分配内存的首地址存在一个整型指针里面;
3.第三种方法是使用指向指针的指针来实现动态内存的传递。这个方法在《高质量C/C++编程》中最后的一份试题中提到了这种方法。

以上三种方法中,第三种方法应该是常用的,也是容易理解的。前两种方法一般应用在一些特别的方面,譬如,GUI编程中窗口的handle的使用,等等。

本文转载自:http://blog.chinaunix.net/uid-21736802-id-1817763.html

共有 人打赏支持
follitude
粉丝 6
博文 118
码字总数 4956
作品 0
浦东
私信 提问
C++中std::allocator的使用

标准库中包含一个名为allocator的类,允许我们将分配和初始化分离。使用allocator通常会提供更好的性能和更灵活的内存管理能力。 new有一些灵活性上的局限,其中一方面表现在它将内存分配和对...

fengbingchun
2017/12/31
0
0
JavaSE学习笔记系列:面向对象(1)

接下来一段时间,会持续发布一个JavaSE学习笔记系列文章! 1.面向对象的思想 要考虑问题有哪些类和哪些对象。 要考虑这些类和这些对象有哪些行为和属性。 考虑类和类之间具备了哪些关系。(继...

landy8530
2017/12/15
0
0
关注C++细节——浅谈指针使用中注意事项

相信大家对指针的用法已经很熟了,这里也不多说些定义性的东西了,只说一下指针使用中的注意事项吧。 一.在定义指针的时候注意连续声明多个指针时容易犯的错误,例如int * a,b;这种声明是声明...

iaccepted
2011/09/02
0
0
C语言系列(五)内存的分配与释放

转载自:https://blog.csdn.net/u011974987/article/details/52290724 首先我们来科普一下: 什么是堆?说到堆,又忍不住说到了栈!什么是 栈? 1、什么是堆:堆是大家共有的空间,分全局堆和...

fybon
06/20
0
0
C语言中内存分布及程序运行中的BSS段、数据段、代码段、堆和栈

1. 栈(stack):又称堆栈,栈是由编译器自动分配释放,存放函数的参数值,局部变量的值等(但不包括static声明的变量,static意味着在数据段中存放变量)。除此之外,在函数被调用时,栈用来...

china_lx1
06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

eslint rules 规则

'rules': { "comma-dangle": ["error", "never"], //是否允许对象中出现结尾逗号 "no-cond-assign": 2, //条件语句的条件中不允许出现赋值运算符 "no-console": 2, //不允许出现console语句 ...

agenyun
17分钟前
1
0
类型判断时instanceof和equals的不同用法

接口设计时为了避免序列化的麻烦,将接口定义为参数为map<String,String>类型的接口,但是现在调用时需要转换当前的实体Bean为Map,接口接收方再把Map转换为另一个Bean实体。过程中的需要对类...

wangtx
24分钟前
1
0
vue 组件间传值(个人精编)

1.父组件向子组件传值 1⃣️.子组件标签绑定需要传递的参数名2⃣️.子组件页面使用props 接收参数 2.子组件向父组件传值  1⃣️.子组件使用$emit来触发一个自定义事件,并传递一个参...

MrBoyce
34分钟前
1
0
(荷兰)彼得·冯·门施著:博物馆学研究的目的

博物馆学研究的目的 (荷)彼得·冯·门施 尽管诸多关于博物馆学认知目的的不同看法可以被归纳为数个主要群体,但没有一个群体可以被称为“学派”。一般来说,学派是由于博物馆学研究目的的不...

乔老哥
44分钟前
2
0
Vue slot的用法

之前看官方文档,由于自己理解的偏差,不知道slot是干嘛的,看到小标题,使用Slot分发内容,就以为 是要往下派发内容。然后就没有理解插槽的概念。其实说白了,使用slot就是先圈一块地,将来...

peakedness丶
56分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部