腾讯微群加入QQ群

 找回密码
 加入我们

!connect_header_login!

!connect_header_login_tip!

搜索
查看: 922|回复: 0

C语言内存分配函数malloc、calloc和realloc

[复制链接]
发表于 2016-8-23 15:03:39 | 显示全部楼层 |阅读模式

C语言中常用的内存分配函数有malloc、calloc和realloc等三个,其中,最常用的肯定是malloc,这里简单说一下这三者的区别和联系。

1、声明

这三个函数都在stdlib.h库文件中,声明如下:

void* realloc(void* ptr, unsigned newsize); 
void* malloc(unsigned size); 
void* calloc(size_t numElements, size_t sizeOfElement);

它们的功能大致类似,就是向操作系统请求内存分配,如果分配成功就返回分配到的内存空间的地址,如果没有分配成功就返回NULL。

2、功能

malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。 
calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。 
realloc(*ptr,size):将ptr内存大小增大或缩小到size。

需要注意的是realloc将ptr内存增大或缩小到size,这时新的空间不一定是在原来ptr的空间基础上,增加或减小长度来得到,而有可能(特别是在用realloc来增大ptr的内存空间的时候)会是在一个新的内存区域分配一个大空间,然后将原来ptr空间的内容拷贝到新内存空间的起始部分,然后将原来的空间释放掉。因此,一般要将realloc的返回值用一个指针来接收,下面是一个说明realloc函数的例子。

#include <stdio.h>
#include <stdlib.h>
int main()
{
	//allocate space for 4 integers
	int *ptr=(int *)malloc(4*sizeof(int));

	if (!ptr)
	{
		printf("Allocation Falure!\n");
		exit(0);
	}

	//print the allocated address
	printf("The address get by malloc is : %p\n",ptr);

	//store 10、9、8、7 in the allocated space
	int i;
	for (i=0;i<4;i++)
	{
		ptr=10-i;
	}

	//enlarge the space for 100 integers
	int *new_ptr=(int*)realloc(ptr,100*sizeof(int));

	if (!new_ptr)
	{
		printf("Second Allocation For Large Space Falure!\n");
		exit(0);
	}

	//print the allocated address
	printf("The address get by realloc is : %p\n",new_ptr);

	//print the 4 integers at the beginning
	printf("4 integers at the beginning is:\n");
	for (i=0;i<4;i++)
	{
		printf("%d\n",new_ptr);
	}
	return 0;
}
运行结果如下:


从上面可以看出,在这个例子中新的空间并不是以原来的空间为基址分配的,而是重新分配了一个大的空间,然后将原来空间的内容拷贝到了新空间的开始部分。

3、三者的联系

calloc(n,size)就相当于malloc(n*size),而realloc(*ptr,size)中,如果ptr为NULL,那么realloc(*ptr,size)就相当于malloc(size)。

0
0

转自:http://blog.csdn.net/xia7139/article/details/22689653?locationNum=10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

QQ|手机版|Archiver|小黑屋|一起疯|苦咖啡 ( 新ICP备12000197号  

GMT+8, 2018-6-25 17:38 , Processed in 0.095327 second(s), 11 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表