动态内存数组(malloc、calloc、realloc、free)

一、为什么要创建动态内存数组

动态内存,顾名思义就是说在内存中非固定的申请数组

在学习该项方法前我们申请内存的方法无非就两种:直接创建变量/通过创建数组的方式来申请空间。

那么直接创建变量/通过创建数组的方式来申请空间的缺点就是一旦创建成功,则空间不能改变。

而动态则不同,它让程序员⾃⼰可以申请和释放空间,就⽐较灵活了。

二、malloc和free

首先来说一下malloc函数,使用方法:void* malloc (size_t size);

参数是你要创建的空间数,单位为字节。

我们来看以下代码:

int main()
{
	int* p = (int*)malloc(sizeof(int) * 5);
	return 0;
}

此时我们创建的malloc函数存在两种可能,首先第一种是创建成功了,第二种就是创建失败了。

我们先来看创建成功后应该怎么做:

#include<stdlib.h>

int main()
{
	int* p = (int*)malloc(sizeof(int) * 5);
	for (int i = 0; i < 5; i++)
	{
		*(p+i) = i;
	}
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", p[i]);
	}
	free(p);
	return 0;
}

以上就是创建成功我们可以做的事,而当malloc函数创建失败时,它会返回NULL,而NULL指针的使用会导致野指针

所以我们要在后面添加一个判断:

int main()
{
	int* p = (int*)malloc(sizeof(int) * 5);
	if (p == NULL)
		return 1;
	for (int i = 0; i < 5; i++)
	{
		*(p + i) = i;
	}
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", p[i]);
	}
	free(p);
	return 0;
}

这样就OK了,这就是malloc函数的完整用法

三、calloc的创建和使用

calloc的作用和malloc的作用相同,都是用来创建动态数组的。

他们之间的不同之处在于calloc在创建完成后会自动将数组内容初始化为0。

我们来看以下代码:

int main()
{
	int* p = (int*)calloc(10 ,sizeof(int));
	if (NULL != p)
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	free(p);
	p = NULL;
	return 0;
}

可以看到,在使用完calloc函数后,所有元素都被初始化为0了。

所以如果我们对申请的内存空间的内容要求初始化,那么使用calloc函数将会非常方便。

四、realloc函数的创建和使用

realloc函数使得malloc和calloc函数(动态内存管理)更加灵活。

realloc(void*ptr,size_t size);

两个参数:ptr指向要修改的数组地址,size则是修改后的大小,单位为字节。

它的作用就是调整已经创建的动态数组大小,我们来看以下代码:

int main()
{
	int* p = (int*)calloc(10, sizeof(int));
	if (NULL != p)
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	int * ptr = realloc(p, 80);
	if (ptr != NULL)
	{
		p = ptr;
	}
	free(p);
	p = NULL;
	return 0;
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-23 04:06:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-23 04:06:02       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-23 04:06:02       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-23 04:06:02       20 阅读

热门阅读

  1. 数据库笔记

    2024-03-23 04:06:02       19 阅读
  2. AI大模型学习

    2024-03-23 04:06:02       17 阅读
  3. LeetCode2671. Frequency Tracker

    2024-03-23 04:06:02       17 阅读
  4. mysql char 与 varchar 的区别

    2024-03-23 04:06:02       17 阅读
  5. Mac安装Homebrew

    2024-03-23 04:06:02       23 阅读
  6. 1063:最大跨度值

    2024-03-23 04:06:02       21 阅读
  7. 洛谷入门——P1567 统计天数

    2024-03-23 04:06:02       21 阅读
  8. 合并两个 Git 仓库,保存所有提交记录

    2024-03-23 04:06:02       21 阅读
  9. CentOS7 安装和使用Docker

    2024-03-23 04:06:02       24 阅读
  10. HTML是什么,它在前端开发中扮演什么角色?

    2024-03-23 04:06:02       24 阅读