C语言动态内存管理函数有4个,分别为malloc,realloc,calloc和free。malloc函数分配一块堆内存;calloc是malloc的变种,功能相同,有细小的差别;realloc修改原内存块大小;free释放参数指针指向的内存块。下面分别介绍它们的函数原型、函数功能和一些特别的注意事项。

Function name

函数原型

函数功能

malloc

void * malloc ( size_t size );

向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。

void* 表示未确定类型的指针。void* 类型可以通过类型转换强制转换为任何其它类型的指针。

char *a = NULL;

//声明一个指向a的char*类型的指针

a = (char*)malloc(100*sizeof(char));

//使用malloc分配内存的首地址,然后赋值给a

realloc

void * realloc ( void * ptr, size_t size );

更改已经配置的内存空间的大小。可以减小也可以增大。

calloc

void * calloc ( size_t num, size_t size );

在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

char*str = NULL;

str = (char*)calloc(10,sizeof(char));

//calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。

free

void free ( void * ptr );

释放之前由上面三个函数分配的内存块,以用于后面的再分配。需要注意的是,执行free后,指针ptr的值没有改变,仍然指向相同的(无效的)位置,而没有被置为NULL。

下面我们着重说明一下realloc。如果将分配的内存减少,realloc仅仅是改变索引的信息。

如果是将分配的内存扩大,则有以下情况:

1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。

2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。

3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。

注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。

看一下示例代码:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//函数原型:void *calloc(size_t n, size_t size);
//函数功能:在内存的动态存储区中分配n个长度为size的连续空间,
//          函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
void testCalloc()
{char*str = NULL;/*分配内存空间*/str = (char*)calloc(10,sizeof(char));/*将hello写入*/strcpy(str, "Hello");/*显示变量内容*/printf("String is %s\n",str);/*释放空间*/free(str);//与malloc的区别://calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。int i;int* pn = (int*)calloc(10, 2*sizeof(int));for(i = 0;i < 20;i++)printf("%d", pn[i]);printf("\n");free(pn);
}
void testRealloc()
{int input;int n;int *numbers1;int *numbers2;int *numbers3;numbers1=NULL;numbers3=NULL;if((numbers2=(int *)malloc(5*sizeof(int)))==NULL)//为numbers2在堆中分配内存空间
    {printf("malloc memory unsuccessful");exit(1);}printf("numbers2 addr: %8X\n",(int)numbers2);for(n=0;n<5;n++) //初始化
    {*(numbers2+n)=n;printf("numbers2's data: %d\n",*(numbers2+n));}printf("Enter new size: ");scanf("%d",&input);//重新分配内存空间,如果分配成功的话,就释放numbers2指针,//但是并没有将numbers2指针赋为NULL,也就是说释放掉的是系统分配的堆空间,//和该指针没有直接的关系,现在仍然可以用numbers2来访问这部分堆空间,但是//现在的堆空间已经不属于该进程的了。numbers3 = numbers2;numbers1=(int *)realloc(numbers2,(input+5)*sizeof(int));if(numbers1==NULL){printf("Error (re)allocating memory");exit(1);}printf("numbers1 addr: %8X\n",(int)numbers1);printf("numbers3 addr: %8X\n",(int)numbers3);/*for(n=0;n<5;n++) //输出从numbers2拷贝来的数据{printf("the numbers1's data copy from numbers2: %d\n",*(numbers1+n));}*/for(n=0;n<input;n++)//新数据初始化
    {*(numbers2+5+n)=n+5;//printf("numbers1' new data: %d\n",*(numbers1+5+n));
    }free(numbers1);//释放numbers1,此处不需要释放numbers2,因为在realloc()时已经释放numbers1=NULL;//free(numbers2);//不能再次释放numbers2=NULL;//free(numbers3); 因为numbers3也指向numbers2指向的内存块,所以不能再次释放numbers3 = NULL;
}
int main(int argc, char* argv[], char* envp[])
{testCalloc();testRealloc();system("pause");return 0;
}

如果当前内存段后有足够的空间,realloc()返回原来的指针,但是,如果当前内存段后没有足够的空间,realloc()返回一个新的内存段的指针。

特别感谢下面两篇文章的作者,不明白的东西好像一下子就豁然开朗了,谢谢你们,所以我也希望把我的所学总结起来,能被更多需要的人看到。

参考文章:

http://www.cnblogs.com/younes/archive/2010/01/23/1654961.html

http://blog.csdn.net/hackerain/article/details/7954006

转载于:https://www.cnblogs.com/wangyuxia/p/6115262.html

C语言动态内存相关函数相关推荐

  1. c语言 动态内存相关函数

    动态内存相关函数 malloc calloc realloc free malloc 原型:extern void *malloc(unsigned int num_bytes); 用法:#inclu ...

  2. C语言-动态内存管理(malloc()、calloc()、realloc()、free())

    C语言 动态内存分配 文章目录 C语言 动态内存分配 前言 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.初识malloc()和free() 2.malloc()和free()的简单使用 ...

  3. c语言malloc引用类型作参数,C语言动态内存函数的理解和总结

    第一:内存的使用 内存可以分为以下三个主要的部分:栈区.堆区.静态区 栈区(stack):存放的是局部变量.函数的形参等都是在该区上存放的. 堆区(heap):动态内存函数开辟的空间.比如malloc ...

  4. C语言-动态内存管理

    C语言中,我们在使用数组的时候,经常有这样的一个问题:数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配.有的时候,我们开辟的空间太小,无法满足我们的需求,有时又太大,浪费空间比较严重. ...

  5. c语言动态内存分配数组,【C】动态内存分配

    ## 动态内存分配的意义 C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组长度是在编译期就必须确定的需求: 程序在运行过 ...

  6. C++语言动态内存管理介绍和示例

    C++动态内存 在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的. 但是可能存在程序的内存需求只能在运行时确定的情况.在这些情况下,程序需要动态分配内存,C ++语言将运算符n ...

  7. C语言动态内存开辟详解(malloc,calloc,realloc,free,柔型数组)

    目录 一.概述 二.相关库函数的使用 1.malloc 2.calloc malloc vs. calloc 异同 3.free的使用 4.realloc 三.易错点 四.C\C++程序的内存开辟规则 ...

  8. linux 在指定区域分配内存 c语言,C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存...

    一.malloc/free概述 malloc是在C语言中用于在程序运行时在堆中进行动态内存分配的库函数.free是进行内存释放的库函数. 1.函数原型 #include void *malloc( s ...

  9. C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存

    最新个人博客 shankusu.me 以下内容转载或参考或引用自 https://blog.csdn.net/zxx910509/article/details/62881131 一.malloc/f ...

最新文章

  1. Xpath语法-爬虫(一)
  2. c++socket模型之我见
  3. Nginx之让用户通过用户名密码认证访问web站点
  4. PyQt5 技术篇-通过参数控制Dialog窗口增加?问号按钮
  5. python库整理:networkx 包
  6. js div加载html_说说 Vue.js 中的 v-cloak 指令
  7. 设置IDEA显示Services窗口,方面服务启动关停等操作
  8. Go在招聘中最吃香,安全工程师薪资涨幅最高 | 软件工程师年度报告出炉
  9. Atitit 职位的规划与来源 1.1. 职位任命多元化 1 1.2. 上级任命 1 1.3. 自我推荐 1 1.4. 他人推荐, 1 1.5. 可以下级选举 1 1.6. 缺席任命 1 1.7.
  10. flash 林度_flash怎么制作呢 ?
  11. jsonp的原理与实现
  12. 万能地图下载器中设置详解
  13. 有没有一点像selina呢?
  14. 项目管理中的量化管理,看得懂的都做到项目经理了
  15. 红米3用电信卡显示无服务器,红米3支持电信卡吗?红米3支持联通卡吗?
  16. Python语言程序设计(MOOC崇天)第三章基本数据类型学习笔记(天天向上的力量+文本进度条)
  17. Android Google Maps API 网络服务用于网络定位、计算路线、获取经纬度、获取详细地址等
  18. 又一家大数据软件公司上市:把亚马逊和微软当对手
  19. 前段时间一直不知道怎么学习,在网上找到一篇好文章分享给在路上的产品经理...
  20. 【转】华为任正非2010年新年致辞:没什么能阻挡前进

热门文章

  1. 【英语天天读】奥哈拉给女儿的信
  2. R与Python之间该如何选择
  3. c语言字母如何代表中文,怎么对中文字符串进行对比
  4. vue 搜索框header_在Vue框架下使用Fullcalendar
  5. python json模块有什么用_Python的json模块及使用
  6. 华硕笔记本如何锁定计算机,我的华硕电脑开机密码被锁定了怎么办
  7. python监控mysql数据改变_python3小脚本-监控服务器性能并插入mysql数据库
  8. Mysql共享锁实例_mysql共享锁与排他锁用法实例分析
  9. php乱码解决方案,php中文乱码问题的4种解决方案
  10. 反向工程_反向工程:宾利精心复刻了1929 Blower车型