【C语言】动态内存管理方式:malloc/calloc/realloc的区别

1、相同点

  1. 都是C语言中用来进行动态内存申请的库函数
  2. 申请的空间在堆上,用完之后必须使用free来进行释放
  3. 如果空间申请空间成功,返回空间的首地址;如果申请失败返回的是NULL,因此在使用之前必须要进行判空
  4. 返回值类型都是void*,在接收返回值时必须进行强转

 

2、不同点

2.1 malloc

函数原型:void* malloc(size_t size)

malloc的参数是用户所申请的字节数,申请空间成功返回空间的首地址,如果申请失败,返回的是空,用户在进行接收时,必须要进行强转在使用时必须要进行判空使用完之后必须要借助free释放。

// 要申请20个int类型的空间
int* p=(int*)malloc(20*sizeof(int));

 

2.2 calloc

函数原型:void* calloc(size_t num, size_t size)

参数

  • num:表示元素的个数
  • size:表示单个元素所占的字节数

功能的不同:calloc会将其申请的内容空间初始化为 0

#include <malloc.h>
void Test1()
{
	int* p1 = (int*)malloc(sizeof(int)*5);
	int* p2 = (int*)calloc(5, sizeof(int));

	printf("malloc的分配值:");
	for (int i = 0; i < 5; i++)
	{
		printf("%d  ", *p1++);
	}
	printf("\n");
	printf("calloc的分配值:");
	for (int j = 0; j < 5; j++)
	{
		printf("%d  ", *p2++);
	}
}

 

2.3 realloc

函数原型:void* realloc(void *p, size_t size)

  • p == NULL—>该函数的功能与malloc类似
  • p != NULL—>将p指向的空间大小调整到size字节
     

假设:p指向空间的大小为oldsize字节

  • size <= oldsize:将p指向的空间缩小,然后返回原空间的首地址即可
  • size > oldsize:将p指向的空间扩大

1)如果原内存空间足够大,系统将会在原内存空间的后面直接扩容,并且直接返回原内存空间的地址
2)如果原内存空间不够,系统将会重新申请一块内存(大小:原来与现在的和),把原来空间的数据拷贝到新的空间,将原来的空间释放

void Test2()
{
	int size = 2000;
	int* p1 = (int*)malloc(size * sizeof(int));
	int* p2 = (int*)realloc(p1,sizeof(int)*20);

	printf("malloc的首地址:%x\n",p1);
	printf("realloc的首地址:%x\n", p2);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值