指针学习日记(三)

本文介绍了C语言中的动态内存管理,包括malloc、calloc和realloc的使用。malloc用于按需分配内存,calloc则会在分配内存前初始化为0,realloc可以调整已分配内存的大小。需要注意的是,分配的内存要通过free释放,避免内存泄漏,并且不能访问已释放的内存。文章强调了检查malloc返回值的重要性,以防止空指针异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态内存分配
当一个数组被声明时,他所需要的内存在编译时就被分配。
但我们总是会写类似的代码:

int a[1000000] = { 0 };

从某种意义上来说,没错,并且这类方式可以很好的避免数组溢出的问题。
但同时,这绝对不是个好程序,原因很简单,内存帮你分配了sizeof(int)*1000000;
但很多内存你可能根本用不到,这就造成了浪费。万幸的时,在C和C++中程序员可以手动分配内存以及释放掉不用的内存。

一、malloc 与 free

两者均在头文件stdlib.h中声明。
malloc从内存池中提取一块合适内存,并向该程序返回一个指向这块内存的指针
当一块以前分配的内存不再使用时,程序调用free函数把它归还给内存池供以后之需。

ps:malloc分配的是一块连续的内存,如果内存池的可用内存可以满足这个需求,malloc就返回一个指向被分配内存块起始位置的指针。如果内存池是空的,它就会请求系统获得更多内存,如果系统都无法提供更多内存,那么将会返回一个NULL指针

因此!!对每个从malloc返回的指针都要进行检查,确保它并非NULL,这非常重要。

ps:C++中的new可能会更加方便,但本次学习日记介绍的主要是C,故在此不再过多复述

void *malloc(size_t size);
void free(void *pointer);

malloc返回一个void指针,正是由于这个原因。标准表示一个void类型的指针可以转换为任何其他类型的指针。

二、calloc与realloc

calloc也用于分配内存,与malloc最大区别是,calloc在返回指向内存的指针前把它初始化为0.relloc函数用于修改一个原先已经分配的内存块大小,可以使一块内存扩大或减小

void *calloc(size_t num_elements,size_t element_size);
void relloc(void *ptr,size_t new_size)

传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。

!!注意,不要访问已经被free函数释放的内存。最常出现的情况是,已经对一个指向动态分配内存的指针进行了复制,然后在程序其他部分访问该副本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值