C语言笔记——动态内存函数3

114 阅读1分钟

​​一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

calloc

功能是为num个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0

与函数malloc的区别只是在于calloc会在返回地址之前把申请的空间的每个字节初始化为全0

如下图

void* calloc(size_t num, size_t size);

int main()
{
	//malloc(10*sizeof(int));
	int* p = (int*)calloc(10, sizeof(int));
	if (p == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	else
	{
		int o = 0;
		for (i = 0; i < 10; i++)
		{
			printf("%d", *(p + i));
		}
	}
	//释放空间
	//free函数是用来释放动态内存开辟的空间的
	free(p);
	p = NULL;
	return 0;
}

\

  当我们对申请的内存空间的内容要求初始化,那么可以使用calloc函数

realloc

void* realloc(void* ptr, size_t size);

ptr 是要调整的内存地址

size 调整之后的新大小

返回值为调整之后的内存起始地址

函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新空间

realloc在调整内存空间的是存在两种情况

情况1:原有空间之后有足够大的空间( 扩展内存就直接原有内存之后直接追加空间,原来空                       间的数据不发生变化)

      情况2:原有空间之后没有足够的空间——开辟新空间(在堆空间上寻找另一个合适大小的连                       续空间来使用),这时函数返回一个新的内存地址

realloc函数的使用: 

int main()
{
	int* p = (int*)malloc(20);
	if (p == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	else
	{
		int i = 0;
		for (i = 0; i < 5; i++)
		{
			*(p + i) = i;
		}
	}
	//就是在使用malloc开辟的20个字节空间
	//假设这里20个字节已经不满足我们使用了
	//希望可以有40个字节的空间
	//这里可以使用realloc来调整动态开辟的内存
	int* p2 = realloc(p, 40);
	int i = 0;
	for (i = 5; i < 10; i++)
	{
		*(p2 + i) = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d", *(p2 + i));
	}

	return 0;
}

\