calloc与realloc函数---堆区分配内存

calloc与realloc函数—堆区分配内存

calloc和malloc一样都是在堆区分配内存

不同点在于 calloc 会将分配的内存初始化为0

realloc重新在堆区分配内存

如果分配的内存比原来要大,这个时候有两种情况出现

1、原有空间后序有足够大的空闲空间,那么直接在原有空间后继续开辟内存,返回原有空间的首地址
2、原有空间后序没有足够大空闲空间,重新会分配一个足够大的空间,并且将原有空间的内容拷贝到新空间下,释放原有空间,将新空间的首地址返回
#include 
#include 

int main(int argc, const char *argv[])
{
	int a = 1;
	int *p = NULL;

	/*在堆区手动申请内存空间*/
	p = (int *)malloc(sizeof(int));

	free(p);//手动申请必须手动释放,否则会被操作系统回收

	p = NULL;//释放掉指针指向的内存空间后,进程对这块内存就不再拥有操作权限,
			//相当于指针指向了一块没有操作权限的内存,为了避免出现野指针,让其指向地址为0的内存空间
	return 0;
}

测试源码

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include

//calloc
void test01()
{
   //int * p = malloc(sizeof(int)* 10);

    int * p = calloc(10, sizeof(int)); //和malloc不同的地方在于 将堆区分配的内容初始化为0

   for (int i = 0; i < 10;i++)
   {
	   printf("%d\n", p[i]);
   }

   if (p!= NULL)
   {
	   free(p);
	   p = NULL;
   }

}

//realloc 重新在堆区分配内存
void test02()
{
	int * p =  malloc(sizeof(int)* 10);

	printf("test02............................%d\n", p);

	for (int i = 0; i < 10; i++)
	{
		p[i] = i+3;
	}
	p = realloc(p, sizeof(int)* 20);

	for (int i = 0; i < 20;i++)
	{
		printf("%d\n", p[i]);
	}

	printf("%d\n", p);

	if (p!=NULL)
	{
		free(p);
		p = NULL;
	}

}



int main(){

	test01();
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

测试结果

calloc与realloc函数---堆区分配内存_第1张图片

你可能感兴趣的:(C)