C语言学习笔记---动态内存分配calloc()和realloc()

x33g5p2x  于2022-02-16 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(308)

动态内存分配函数除了常用的malloc函数以外,还有calloc函数和realloc函数,这两个函数的原型如下:

void *__cdecl calloc(size_t _NumOfElements,size_t _SizeOfElements);

void *__cdecl realloc(void *_Memory,size_t _NewSize);

calloc函数

calloc函数用于动态的分配内存,并初将其始化为0。它有两个参数,第一个参数用于设置连续空间的数量,第二个参数用于设置每个空间的大小。所有它分配的总空间字节数为 _NumOfElements * _SizeOfElements。比如 calloc(10,2) 就是分配 10*2 个字节的空间,并将空间初始化为0。

下面通过一段代码演示calloc函数的用法。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
	int *pi;
	int i,j;

	printf("输入需要分配的空间数量:");
	scanf("%d",&i);

	pi = (int*)calloc(i,sizeof(int));
	if(pi == NULL) {
		printf("内存分配失败!\n");
		exit(1);
	}
	printf("\r\n内存分配成功:");
	for(j=0; j<i; j++) {
		pi[j] = j*10;
	}
	for(j=0; j<i; j++) {
		printf("%d ",pi[j]);
	}

	printf("\r\n\r\n释放内存!\r\n");
	free(pi);

	return 0;
}

通过代码可以看出,calloc函数的用法和malloc函数基本一样。通过键盘输入需要分配空间的数量,然后使用calloc函数分配内存,每一个内存的大小是 int类型,内存分配完成之后,向内存中写入数据,并将内存中的数据打印出来,使用完内存之后,使用free函数释放刚申请到的内存。

realloc函数

realloc函数用来重新分配内存空间,比如使用malloc函数分配了一片内存空间,在使用的过程总需要调整刚才申请的空间大小,就可以使用realloc函数来重新分配内存空间。

realloc函数有两个参数,第一个参数是已经分配成功的空间地址指针,第二个参数时新空间的大小。新的空间可以比旧空间大,也可以比旧空间小,也可以和旧空间大小一样。

如果第二个参数为0,那么它所指向的空间就会被释放,作用和free函数一样。
如果第二个参数比旧空间的大,那么内存中原来的内容会被保留,新增加的内容添加到原来的内容后面。如果第二个参数比旧空间小,那么原来内存中的尾部就会被截掉,前面的内容依然不变。

realloc函数成功分配到新的空间后,第一个参数的指针就会被系统回收,此时要操作新空间的话必须使用realloc函数返回的新指针,而不能使用旧指针。新分配的内存地址有可能和旧地址相同,也有可能不同。

在刚才代码的基础上增加realloc函数的使用。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
	int *pi,*pj;
	int i,j;

	printf("输入需要分配的空间数量:");
	scanf("%d",&i);

	pi = (int*)calloc(i,sizeof(int));
	if(pi == NULL) {
		printf("内存分配失败!\n");
		exit(1);
	}
	printf("\r\n内存分配成功:");
	for(j=0; j<i; j++) {
		pi[j] = j*10;
	}
	for(j=0; j<i; j++) {
		printf("%d ",pi[j]);
	}

	printf("\r\n\r\n输入重新分配内存大小:");
	scanf("%d",&i);
	pj = (int*)realloc(pi,i);
	if(pj == NULL) {
		printf("内存分配失败!\n");
		exit(1);
	}
	for(j=0; j<i; j++) {
		printf("%d ",pj[j]);
	}

	printf("\r\n\r\n释放内存!\r\n");
	free(pj);

	return 0;
}

首先输入需要分配空间的大小,使用calloc函数进行内存分配,然后给分配的内存空间中写入数据并打印出来,这时输入需要重新分配空间的大小,使用realloc函数修改空间大小,然后打印新空间中的内容。

测试结果如下:

首先分配8个空间,将内容打印出来,接着重新修改空间的大小为6,然后打印空间中的数据,可以看到当新空间中的内容和旧空间中的数据一样。

当新分配的空间比旧空间大时,前面空间中的数据和旧空间里面的一样,新增加空间里面的数据是随机的。

相关文章