malloc、calloc、realloc、free理解

本文介绍了C语言中malloc,realloc,free和calloc内存管理函数的工作原理,包括空间分配、大小调整、初始化和释放规则。特别强调了64位系统与32位系统在空间限制上的差异以及二次释放问题的注意事项。
摘要由CSDN通过智能技术生成

malloc:开辟空间不会做任何初始化,申请的空间值是一个随机值

在32位操作系统下只能最多开辟2^32个空间大小

char* ptr = (char*) malloc(0x7fffffff);

如果再进行开辟则会报错,在64位下可以正常通过,最多可开辟2^64。

char* ptr = (char*) malloc(0x7fffffff);
char* ptr = (char*) malloc(0xffffffff);

realloc:调整空间大小

先开辟一个字节的空间大小

char* ptr = (char*) malloc(sizeof(char));

调整空间大小,给原先只开辟一个字节空间大小的ptr,扩充到两个字节空间大小。

char* ptr2 = (char*) realloc(ptr, 2* sizeof(char));

申请新的空间,功能和malloc相同

char* ptr3 = (char*) realloc(NULL, sizeof(char));
char* ptr4 = (char*) realloc(ptr3, sizeof(char)* 100);

free:只能显示释放realloc返回之后的空间,传入realloc中的指针空间不能显式释放

比如ptr4要在ptr3的基础上再往后申请100个字节空间,如果不够,则会重新找一块新的空间。因此在释放的时候,只用显式释放ptr4的空间。realloc里面会帮助我们释放,不需要在外面再显式释放传入的ptr3空间:因为传入的ptr3空间可能被释放也可能没有被释放,主要看后面有没有可利用的空间,如果没有则会被释放,申请更大的空间。

以上realloc申请的空间在释放空间时会有所不同,按理说开辟了三个空间后,应该释放三个空间大小,但是运行会报错,因为ptr和ptr2的空间地址相同,会有二次释放的问题。
所以ptr指向的空间不能显式释放

通常只释放ptr2

//free(ptr);
free(ptr2);
//free(ptr3);
free(ptr4);

calloc:申请空间+0的初始化

申请四个字节空间
把四个字节全部置为0

char* ptr7 = (char*) calloc(4, sizeof(char));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值