C语言中动态内存分配 malloc realloc calloc 的使用和比较



1.malloc

作用:分配内存块

语法:void * malloc(size_t size);

参数

      size      要分配的字节


返回值

            1.内存充足返回该内存的指针

            2.内存不足则返回NULL

 

____________________________________________________________________


2.realloc

作用:重新分配内存块

语法:void * realloc(void* p, size_t size);


参数

     p      以前分配的内存块的指针

     size 新的大小     (以字节为单位)

 

返回值

            1.原内存块后内存充足则返回原指针

            2.原内存块后内存不够用返回新的地址

            3.内存不足则返回NULL

            4.size0释放并返回NULL

 

—————————————————————————————————————

3.calloc

作用:分配n个长度为size的连续空间并初始化元素为0

语法:void * calloc(size_t n, size_t size);

参数

     n元素的个数

     size   每个元素字节长度

返回值

            1.分配成功返回起始地址

            2.失败返回NULL

 

—————————————————————————————————————


举例子:

(一)malloc与calloc的对比

代码:

//环境  win7 64位  vs2008
#include 
#include 

int main(void)
{
	int num;			//元素个数
	int* p;				//内存块地址

	scanf("%d",&num);
	p = (int *)malloc(sizeof(int)*num);
	printf("%x \n",p);		//打印malloc后的首地址

	p = (int *)calloc(num,sizeof(int));
	scanf("%d",&num);
	printf("%x \n",p);		//打印calloc后的首地址

	return 0;
}

调试过程:


1.malloc不会初始化元素的值而是被系统默认初始化为一个无效值


C语言中动态内存分配 malloc realloc calloc 的使用和比较_第1张图片



2.calloc会将元素初始化为0


C语言中动态内存分配 malloc realloc calloc 的使用和比较_第2张图片


(二)malloc与  realloc的对比

代码:

#include 
#include 

//malloc与realloc的对比
int main(void)
{
	int num = 0;				//元素个数
	int *p = NULL;				//内存首块地址
	int i = 0;

	scanf("%d",&num);			//输入元素个数
	p = (int *)malloc(sizeof(int)*num);
	
	printf("%x \n",p);			//打印malloc分配空间后的首地址
	
	scanf("%d",&num);			//分配与malloc大小差不多的块
	p = (int *)realloc(p,sizeof(int)*num);

	for (i = 0; i < num; i++)	
	{
		p[i] = i;
	}
	printf("%x \n",p);			//打印realloc后的首地址 


	scanf("%d",&num);			//配与malloc大小差很多的块
	p = (int *)realloc(p,sizeof(int)*num);
	for (i = 0; i < num; i++)
	{
		p[i] = i;
	}
	printf("%x \n",p);			//再次打印realloc后的首地址
	free(p);					//记得free防止内存泄露


	return 0;
}


从上一个对比中我们知道了malloc不会初始化元素的值,下面我们先来看一下realloc会不会初始化原始的值


1.下图可以看到malloc依然没有初始化

C语言中动态内存分配 malloc realloc calloc 的使用和比较_第3张图片


2.当分配和malloc分配大小差不多的块时,p没有改变说明还有足够的空间,还可以看到realloc分配空间的时候也不会初始化


C语言中动态内存分配 malloc realloc calloc 的使用和比较_第4张图片


3.当分配200个元素 时,此时没有足够的连续内存块空间分配,会返回新内存块的地址并把原来的内容复制过来


C语言中动态内存分配 malloc realloc calloc 的使用和比较_第5张图片



注意:分配完毕要释放内存,第一个例子忘记释放。

你可能感兴趣的:(C语言中动态内存分配 malloc realloc calloc 的使用和比较)