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语言中malloc()free()calloc()realloc() -> 正文阅读

[C++知识库]C语言中malloc()free()calloc()realloc()

申请内存malloc()在申请内存时不会对内存进行初始化赋值

在申请内存后,没有对内存进行初始化的话,这段内存中就存储着系统随机值。

int n = 5;
int* p = (int*)malloc(n * sizeof(int));
  1. malloc(size):size就是你想开辟的内存的字节大小。我们通常想要用这段内存存储n个某种类型的数据,所以如果我们想要用这段内存存储n个int大小(四字节大小)的数据(需要n*4字节内存),就使用malloc(n * sizeof(int))或malloc(n * 4)。
  2. (int:int就是你想要分割的单个格子大小*。系统不知道这段内存是单个一段,还是你想将其分为几个单元格。所以我们需要给系统明确我们想要怎么样,如果我们想要用这段内存存储int大小的数据,就用int标记,系统自动识别,将这段内存分隔为4字节大小的连续单元格。还因为这是开辟的内存地址,需要用指针来指向所以用(int*)将其强转为指针
  3. int p*:对应想要存储的数据大小,就要选择对应指针解析存储单元大小相同,指针加整型能力相同的指针类型。malloc()将开辟好的内存起始地址返回回来,用指针进行保存。未成功开辟内存就返回一个空指针。

有两种给内存初始化的方式:
(1)直接for循环给内存中每个单元格赋值。

for (int i = 0; i < n; i++) {
	p[i] = 1;
}

(2)以string.h头文件中的memset()函数实现内存初始化。

memset(初始化内存(void*),int value,unsigned int size);
//初始化内存:所要初始化的内存地址,也就是指向该内存的指针
//value:想要以什么值进行初始化
//size:想要初始化的内存大小(字节大小)

由于memset()函数是以字节为单位进行内存初始化的,所以memset(p,0,nsizeof(int))可以将所开辟的内存的每个字节初始化为0。
在这里插入图片描述
所以使用memset(p,1,n
sizeof(int))并不是将一个单元格中的数据初始化为1,而是将每个字节初始化为1。

memset(p,1,n*sizeof(int));

在这里插入图片描述

申请内存calloc()在初始化内存时,将分好的各个单元格初始化为对应数据类型的默认值

//类型* 指针名 = (单元格解析大小 *)calloc(单元格数目,单元格大小);
int* p = (int*)calloc(n , sizeof(int));
double* p = (double*)calloc(n , sizeof(double));

申请扩容realloc()

//类型* 指针名 = (解析单元格大小*)realloc(要扩容的内存地址(指针名),扩容内存的目标总字节大小);
int* q = (int*)realloc(p,10*sizeof(int));

示例

//类型* 指针名 = (解析单元格大小*)realloc(要扩容的内存地址(指针名),扩容内存的目标总字节大小);
//原先内存为5*4=20字节,现在扩容到10*4=40字节。
p = (int*)realloc(p, 10*sizeof(int));// 方法(1)  //error
if(p==NULL) exit(1);                
int *q = (int*)realloc(p, 10*sizeof(int));//方法(2) //right
if(q==NULL) exit(1);               

释放内存free()

//free(指向要释放的内存的起始地址地指针);
int n = 5;
int* p = (int*)malloc(n *sizeof(int));
free(p);//p存放的就是所开辟内存的起始地址
p = NULL;

本文借鉴于

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:08:17  更:2022-09-21 00:10:32 
 
开发: 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 14:51:24-

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