文档章节

动态内存分配的传递

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
粉丝 4
博文 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语言中内存分布及程序运行中的BSS段、数据段、代码段、堆和栈

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

china_lx1
06/27
0
0
lwip内存分配详解对比 mem_init memp_init 源码分析

Lwip内存分配 mem_init ()分配方式介绍 内存堆的初始化函数,主要是告知内存堆的起止地址,以及初始化空闲列表,memmalloc( ) 申请分配内存。将总共需要的字节数作为参数传递给该函数,返回值...

cicue
2014/06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

arts-week5

Algorithm 824. Goat Latin - LeetCode 152. Maximum Product Subarray - LeetCode 110. Balanced Binary Tree - LeetCode 67. Two Sum II - Input array is sorted - LeetCode 665. Non-dec......

yysue
17分钟前
0
0
iOS开发之AddressBook框架详解

iOS开发之AddressBook框架详解 一、写在前面 首先,AddressBook框架是一个已经过时的框架,iOS9之后官方提供了Contacts框架来进行用户通讯录相关操作。尽管如此,AddressBook框架依然是一个非...

珲少
47分钟前
1
0
两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践

Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot...

Java填坑之路
今天
3
0
《Spring5学习》04 - 面向切面编程

一、Spring面向切面编程的基本概念 面向切面编程(即AOP):把项目中需要再多处使用的功能比如日志、安全和事务等集中到一个类中处理,而不用在每个需要用到该功能的地方显式调用。 横切关注...

老韭菜
今天
2
0
day61-20180819-流利阅读笔记

跑道没了,它们还在跑:澳门赛狗业的遗孤 Daniel 2018-08-19 1.今日导读 相信你早就知道香港有个赛马会,可是你听说过香港的邻居澳门原本有个赛狗会吗?其实,对于澳门人来说,赛狗这项活动历...

aibinxiao
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部