15_calloc()函数和realloc()函数

calloc函数

#include
void * calloc(size_t  nmemb,size_t  size);
参数:
    1、nmemb 申请的数据块数
    2、size  每一块大小
    3、所以申请总大小=nmemb * size  
返回值:
    成功:返回空间的起始地址
    失败:返回NULL
特点:申请的空间自动清零    
void test04()
{
	int n = 0;
	int i=0;
	int *arr=NULL;
	
	//1、获取用户大小
	printf("请输入元素的个数:");
	scanf("%d", &n);
	
	//2、根据大小从堆区申请空间
#if 0
	arr = (int *)malloc(n*sizeof(int));
	if(NULL == arr)
	{
		//perror 错误输出
		perror("mallac");
		return;
	}
	memset(arr,0,n*sizeof(int));//清零
#endif

#if 1
	arr=(int *)calloc(n, sizeof(int));//自动清零  不需要使用memset
	if(NULL == arr)
	{
		//perror 错误输出
		perror("calloc");
		return;
	}
#endif
	//对arr的读写操作
	printf("请输入%d个int数据\n",n);
	for(i=0;i<n; i++)
	{
		scanf("%d", arr+i);
	}

	//遍历数组
	for(i=0;i<n;i++)
	{
		printf("%d ", arr[i]);
	}

	//释放空间
	free(arr);
}

运行结果:

realloc动态追加或减少空间

#include
void* realloc(void *s, unsigned int newsize);
功能:
	在原先s指向的内存基础上重新申请内存,新的内存的大小为
new_size 个字节,如果原先内存后面有足够大的空间,就追加,
如果后边的内存不够用,则realloc函数会在堆区找一个newsize个字节
大小的内存申请,将原先内存中的内容拷贝过来,然后释放原先的内存
,最后返回新内存的地址。
参数:
	s:原先开辟内存的首地址    
	newsize:新申请的空间的大小
返回值:新申请的内存的首地址 
注意:一定要保存 realloc的返回值
void test06()
{
	int *arr = NULL;
	int n = 0;
	int i=0;
	int n_new = 0;

	//1、获取用户大小
	printf("请输入元素的个数:");
	scanf("%d", &n);
	
	arr=(int *)calloc(n, sizeof(int));//自动清零  不需要使用memset
	if(NULL == arr)
	{
		//perror 错误输出
		perror("calloc");
		return;
	}

	printf("请输入%d个int数据\n",n);
	for(i=0;i<n; i++)
	{
		scanf("%d", arr+i);
	}

	//遍历数组
	for(i=0;i<n;i++)
	{
		printf("%d ", arr[i]);
	}

	//再追加5个元素
	printf("请输入新增的元素个数:");
	scanf("%d", &n_new);
	arr = (int *)realloc(arr, (n+n_new)*sizeof(int));

	printf("请输入新增的%d个int数据\n",n_new);
	for(i=n;i<(n+n_new); i++)
	{
		scanf("%d",arr+i);
	}

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

	free(arr);
}
int main(int argc,char *argv[])
{
	test06();
	return 0;
}

15_calloc()函数和realloc()函数_第1张图片

堆区空间使用的注意事项

void test08()
{
	int *p2 = NULL;
	int *p3 = NULL;
	//1、指向堆区空间的指针变量 不要随意的更改指向
	int *p=(int *)calloc(1,sizeof(int));
	int num = 10;
	p = &num;//p指向num  导致calloc申请的空间泄露

	//2、不要操作已经释放的空间
	p2 = (int *)calloc(1,sizeof(int));
	*p2 = 1000;
	//释放该空间
	free(p2);
	printf("*p2 = %d\n", *p2);//不确定

	//3、不要对堆区空间重复释放
	p3 = (int *)calloc(1,sizeof(int));
	free(p3);
	free(p3);//多次释放
}

你可能感兴趣的:(练习代码)