malloc、calloc等C语言中的动态内存管理

本文介绍了C语言中动态内存管理的基本操作,包括malloc、free、calloc和realloc函数的使用。malloc用于在堆区分配内存,calloc则可以一次性分配并初始化为0,free用于释放内存,realloc可以调整已分配内存的大小。文章强调了动态内存管理中需要注意的错误,如空指针检查、避免多次free和防止内存泄漏。
摘要由CSDN通过智能技术生成

C语言中的动态内存管理


前言

在C语言中当我们采用数组存储数据时,数组必须定义固定的长度,程序运行时数组元素的数目是固定的,,如果定义短了的话程序无法运行,如果定义太大了又显得很浪费。


提示:以下几个函数都包含在stdlib.h头文件中。

一、malloc

在堆区开辟

malloc()
void* malloc(size_t size),唯一的参数是要开辟的字节数,返回值是该内存起始地址且返回值需要检查。
例如开辟10个整型空间:int* p = (int*)malloc(sizeof(int) * 10)
开辟好之后需要进行检查:

if(p == NULL)
{
	perror("malloc");//打印错误信息
	return 1;//错误返回
}

在栈上开辟空间系统会自动回收,而在堆区开辟空间,需要自己释放。
还有一个和malloc用法相同的alloca(),该函数是在栈区进行内存开辟,不用释放空间。

二、free

释放内存

free()
void free(void* p),唯一参数是需要释放的空间指针,无返回值。
主要作用是将空间回收,在free掉某个空间后,必须将地址置空,否则指针将变为野指针

free(p);
p = NULL;

三、calloc

开辟内存且元素初始化为0

void* calloc(size_t num, size_t size),第一个参数是元素的个数,第二个参数是元素的字节大小,返回值是该内存起始地址且返回值需要检查。
例如开辟10个整型空间:int* p = (int*)calloc(10,sizeof(int) )
开辟好之后也需要同malloc一样检查。

四、realloc

改变已开辟空间的大小
void* realloc(void* memblock, size_t size ),第一个参数是开辟好的空间指针,第二个参数是更改后的字节大小,返回一个新地址,返回值也需要做检查。
例如将40个字节的内存空间更改为80个字节的内存空间。

int* p = (int*)malloc(sizeof(int) *  10)
if(p == NULL)
{
	perror("malloc");//打印错误信息
	return 1;//错误返回
}
int * pp = (int*)realloc(p,80);
if(pp != NULL)
	p = pp;

错误说明

1.若不对申请的内存空间进行空指针判断,有可能会对空指针解引用;
2.一块内存空间不能多次free;
3.如果忘记释放(且无return 0),会出现内存泄漏。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值