文档章节

动态内存分配的传递

follitude
 follitude
发布于 2016/05/16 11:09
字数 581
阅读 52
收藏 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的使用,等等。

follitude
粉丝 6
博文 118
码字总数 4956
作品 0
浦东
私信 提问
加载中
请先登录后再评论。
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
7.3K
8
开源数据访问组件--Smark.Data

Smark.Data是基于Ado.net实现的数据访问组件,提供基于强类型的查询表达式进行灵活的数据查询,统计,修改和删除等操作;采用基于条件驱动的操作模式,使数据操作更简单轻松;内部通过标准SQL...

泥水佬
2013/03/12
2.6K
0
硬实时操作系统--Raw OS

Raw-OS 起飞于2012年,Raw-OS志在制作中国人自己的最优秀硬实时操作系统。 Raw-OS 操作系统特性 内核最大关中断时间无限接近0us, s3c2440系统最大关中断时间实测0.8us。 支持idle任务级别的事...

jorya_txj
2013/03/19
6.3K
1
高效率的nio框架--nio java raptor

设计初衷是提供方便易用,且高效率的nio框架,一部分实现上参考了mina。还包括线程池,编解码,内存池等机制,以便于开发高性能tcp程序。 文档后续会慢慢的补上。 整体实现上尽量少的使用锁,...

齐楠
2012/12/12
3.3K
0
HTML动态嵌入Flash--embedSWF

embedSWF 是一个轻量的HTML动态嵌入Flash的方案。gzip之前,仅3kb大小!比swfobject要小很多。 简洁的API,所有object和embed标记支持的参数都通过一个options传递。甚至支持在options中传递...

JonyZhang
2013/05/01
5K
2

没有更多内容

加载失败,请刷新页面

加载更多

箭头翻转效果

vue实现点击箭头的旋转动画(收起展开)效果 https://blog.csdn.net/Rampage_w/article/details/106496646?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_ra......

花乐天
37分钟前
11
0
预告 | 一场解决SSL/TLS证书困局的硬核发布会

大数据时代,信息安全威胁日益严峻,国内国际(等保2.0 、密码法、GDPR等)法规的出台,使得数据安全和隐私保护愈加被高度重视, SSL 证书作为互联网的安全标签,需求量日益增加,已然成为企...

osc_q5m9dzk0
37分钟前
19
0
提高数据处理效率的excel小技巧(一)

转自:求知鸟 作者:求知鸟 这是一个技巧贴,直接上干货: 1、你想在excel中看到函数值是如何计算出来的? Ctrl+~:进入函数视图 2、去除重复值方式有哪些? a、数据—数据工具—删除重复值(...

朱小五
昨天
0
0
全网疯传,50个精选BAT等大厂大数据、算法落地经验,白拿不谢!

话不多说,直接上干货资料,我们精选了50个百度、腾讯、阿里等大厂的大数据、算法落地经验,分享给大家: 识别二维码,回复"大厂经验",获取PDF干货合集! 合集目录: 识别二维码,回复"大厂...

BBuf
今天
11
0
小白写论文 | 技术性论文结构剖析

【前言】:公众号的AI初学者交流群已经建立啦,公众号后台回复【加群】可以加入。群里都是些一起学习的朋友,大家学习路上,结个伴。 【公众号资源汇总】:炼丹图书馆 | AI初学者所需要的资料...

机器学习炼丹术
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部