malloc与calloc、realloc的区别

       malloc:函数原型void* malloc(size_t size);动态申请大小为size的内存块,返回指向所分配的连续存储域的起始地址的指针,另外当函数未能成功分配存储空间,就会返回一个NULL指针,因此在使用该函数时应该检测返回值是否为NULL,确保非空后再继续使用;malloc不知道用户请求的内存需要存储的数据类型,因此返回void*;
      calloc:函数原型void* calloc(size_t Count,size_t size);第一个参数为元素个数,第二个参数为元素大小,calloc在返回内存的指针之前将它初始化为0;

    int* pm = (int*)malloc(10*sizeof(int));
	int* pc = (int*)calloc(10,sizeof(int));
	for (size_t i = 0; i < 10; i++)
	{
		cout << "malloc:" << *pm++<<endl;
		cout << "calloc:" << *pc++<<endl;
	}

输出结果如下

由此可见,malloc申请动态内存时,并没有对内存内容初始化,而calloc则进行了初始化。

        realloc与上面两个函数不同,它主要用来进行扩容,函数原型为void* realloc(void*  _Block,size_t _Size);_Block指向原来空间基址的指针,_Size为接下来需要扩充容量的大小。如果size较小,原来申请的动态内存后面还有空余内存,系统将直接在原内存空间后面扩容,并返回原动态空间基地址;如果size较大,原来申请的空间后面没有足够大的空间扩容,系统将重新申请一块内存,并把原来空间的内容拷贝过去,原来空间free;如果size非常大,系统内存申请失败,返回NULL,原来的内存不会释放。

如:

int* pm = (int*)malloc(10*sizeof(int));
int* pr = (int*)realloc(pm, 2000 * (sizeof(int)));
printf("pm address:%x\n", pm);
printf("pr address:%x", pr);

由于此时size较大,故realloc返回的指针地址与malloc的不同

而如果将size设置比较小,则malloc与realloc返回的指针地址相同

int* pm = (int*)malloc(10*sizeof(int));
int* pr = (int*)realloc(pm, 2 * (sizeof(int)));
printf("pm address:%x\n", pm);
printf("pr address:%x", pr);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值