IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 动态内存函数记录 -> 正文阅读

[C++知识库]动态内存函数记录

目录

1.malloc和free

2.calloc

3.realloc


1.malloc和free

? ? ? ? malloc是c语言提供地动态开辟函数。

void* malloc (size_t size);

? ? ? ? malloc向内存申请一块连续可用地空间,并返回这个空间的指针,如果开辟失败返回的是空指针。参数size是表示要开辟空间的大小,size = 0的话,malloc的行为是未定义的,取决于不同的编译器。返回值是void*类型,因此在使用时需要自己根据需要定义空间的类型。

? ? ? ? 由于malloc是在堆区上开辟空间,在使用结束后并不会自己将内存空间还给操作系统。所以c语言提供了free函数来释放开辟的内存空间。

void free (void* ptr);

? ? ? ? 如果free参数的指针不是动态开辟空间的,那么free的行为未定义。

? ? ? ? free(NULL)相当于什么也不操作

? ? ? ? 下面来尝试使用一下,用malloc函数开辟一块空间来存储int型的数组,同时在使用完这块空间后,记得free释放空间。还要特别注意的是,空间释放完后的ptr指针仍指在原来的位置,我们要及时将他指向空指针,以免出现野指针的风险。

int main()
{
	int num = 0;
	scanf("%d", &num);
	int* pt = (int*)malloc(num * sizeof(int));
	int i = 0;
	for (i = 0; i < num; i++)
	{
		*(pt + i) = i;
	}
	for (i = 0; i < num; i++)
	{
		printf("%d ", *(pt+i));
	}
    free(pt);
	pt = NULL;
	return 0;
}

2.calloc

? ? ? ? calloc的作用其实与malloc相同,也是开辟一块连续可用的空间。唯一的区别就是calloc在开辟完之后会对这块空间进行初始化。

void* calloc (size_t num, size_t size);

? ? ? ? 将calloc开辟的空间直接打印,我们会看到空间内已经赋值好0。

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

3.realloc

????????有时会我们发现之前申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了有一个合理的内存,我们可以使用realloc函数做到对动态开辟内存大小的调整。?

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

? ? ? ? ptr为要调整的空间地址,size是新的大小,返回一个新的内存空间地址。由于可能之前空间的后续未使用空间不能满足重新调整空间大小的要求,需要从另一块空间开辟,所以返回的地址不一定是先前空间的地址。

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

?


  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 16:54:12  更:2021-10-03 16:56:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 21:36:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码