栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言知识梳理——动态内存分配

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言知识梳理——动态内存分配

C语言知识梳理——动态内存分配
  • 前言
  • 动态内存分配
    • malloc
    • calloc
    • realloc
    • free

前言

通常情况下,定义数组一般都是直接初始化(eg:int arr1[]={1,2,3,4,5};),或者是限定数组元素个数(eg:int arr2[10]={0};)。但是这些定义数组的方式具有很大的局限性:①当实际不需要那么多数组元素的时候,就会造成空间的浪费;②当实际的需求的元素个数超出了数组的容量时,就容易造成栈溢出。针对这些问题,使用动态内存分配就能够很好地去应对,在堆上灵活开辟空间满足用户需求。

动态内存分配 malloc

函数原型:void *malloc( size_t size );
头文件:

malloc的参数是待开辟空间的总字节大小,在开辟成功之后会返回空间的起始地址,若空间不够开辟失败则会返回NULL。

注意事项:
1、将malloc后的值赋值给指针变量的时候,需进行强制类型转换,以便使得赋值符号两边类型一致,例如:

int* i = (int*)malloc(sizeof(int) * 20);

2、由于malloc有可能会失败,因此在使用之前一定需要判断指针是否为NULL,例如:

int* i = (int*)malloc(sizeof(int) * 20);
if (i != NULL)
{
	//代码
}
calloc

函数原型:void *calloc( size_t num, size_t size );
头文件:

calloc的参数是元素个数num和每个元素的大小size。相比于malloc,calloc除了能够开辟空间之外,还会将内存空间初始化为0。

注意事项和malloc一致。

realloc

函数原型:void *realloc( void *memblock, size_t size );
头文件:

realloc通常用于空间不足时进行空间的扩容,参数是待扩容的空间的起始地址memblock和扩容后的总字节大小size,在开辟成功之后会返回空间的起始地址,若空间不够开辟失败则会返回NULL。

realloc在扩容时会面临两种特殊情况:
1、原空间之后有足够大的空间时,会直接在原空间之后开辟空间,开辟成功后返回原空间的起始地址;
2、原空间之后没有足够的空间时,realloc会去寻找一块新的适合的连续空间,将原空间的数据拷贝到新空间,开辟成功后返回新空间的起始地址,并自动释放原空间(开辟失败不会释放原空间)。

realloc相较于malloc和calloc,还有些事项需要额外注意:
1、如果第一个参数memblock==NULL,效果等同于malloc;如果第二个参数size==0,效果类似于free(),但还是有区别的(free(i)释放原空间,无返回值,i仍旧保存了原空间的地址,需要手工赋值NULL避免野指针;realloc(i,0)则会释放原空间,并返回NULL,i同样还是保存了原空间的地址,需要手工赋值NULL避免野指针)

MSDN上的解释:realloc returns a void pointer to the reallocated (and possibly moved) memory block. The return value is NULL if the size is zero and the buffer argument is not NULL, or if there is not enough available memory to expand the block to the given size. In the first case, the original block is freed. In the second, the original block is unchanged.

2、realloc如果失败会返回NULL。因此,必须创建一个临时的指针变量代替原指针接收realloc的返回值,避免直接接收导致原空间的地址都无法找到。

free

函数原型:void free( void *memblock );

free只针对动态内存分配,是完整的动态内存分配流程中不可或缺的一部分,遵循两个“一定”原则:
①一定要记得及时free(),避免内存泄露;
②free完后一定要记得将指针赋NULL,避免野指针的产生。

free(NULL)什么事情都不会发生。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/875975.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号