当前位置: 首页 > news >正文

堆区空间操作

堆区空间操作

堆区空间赘述

  • 需要使用malloc calloc realloc从堆区申请空间,必须使用指针变量保存得到的地址编号。
  • 使用完后,记得调用free释放堆区空间。
  • 堆区空间 是在程序运行过程中 根据需要申请。 所以又叫动态空间。
  • 申请空间、使用空间、释放空间

malloc函数 申请堆区空间

使用头文件stdlib.h

#include <stdlib.h>
void *malloc(size_t size);

参数size:表示申请空间的大小(单位是字节)
返回值:
成功:返回堆区空间的起始地址
失败:返回NULL
注意:
1、记得对malloc的返回值 强转成你需要的地址类型
2、在ubuntu16.04中使用gcc编译器下malloc会对申请到的堆区空间自动清零

calloc函数申请堆区空间

void *calloc(size_t nmemb, size_t size);

参数nmemb:内存的块数
参数size:每一块的大小
申请的总大小=nmemb*size
返回值:
成功:返回堆区空间的起始地址
失败:返回NULL
在任何平台下 calloc都会对申请的堆区空间清零

    int n = 0;scanf("%d", &n);//开辟空间// int *arr = (int *)malloc(n * sizeof(int));//malloc添加的写法int *arr = (int *)calloc(n, sizeof(int));//calloc添加的写法//确认空间开辟成功if (NULL == arr){return;}for (int i = 0; i < 10; i++){printf("%d", arr[i]);}

realloc函数追加空间

realloc只能对malloc、calloc申请的堆区空间进行追加

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

参数ptr:是旧空间的起始地址
参数size:旧空间大小+新空间大小
必须使用指针变量保存realloc的返回值

    int n = 0;scanf("%d", &n);//开辟空间// int *arr = (int *)malloc(n * sizeof(int));int *arr = (int *)calloc(n, sizeof(int));//确认空间if (NULL == arr){return;}//追加空间 //arr=(int*)realloc(arr, 10 * sizeof(int));//这里实际可以省略realloc(arr, 10 * sizeof(int));if (NULL == arr){return;}for (int i = 0; i < 10; i++){printf("%d", arr[i]);}

注意事项:
追加空间的时候可以省略arr=是因为追加的空间在后面使用sizeof获取空间大小的时候获取的数值不对,也就需要手动保存添加内存大小,这时的sizeof(arr)还是最初开辟的空间大小,追加的并不算在内

  • 在使用 realloc 时,你需要手动跟踪和管理内存块的大小,以确保你传递给 memset、realloc 或其他函数的大小是正确的。
  • sizeof 只在编译时有效,并不能用于动态内存的大小管理。

内存设置函数memset

#include <string.h>
void *memset(void *s,int c,size_t n);

功能:将指定的内存的每一个字节 设置成特定的值
参数s:指定内存的起始地址
参数c:每个字节的特定值
参数n:从s开始 操作n个字节
注意:主要用于将指定的内存清0(置零),头文件是string,如果不是清0,写1或者其他,出现其他不符合逻辑的结果,所以主要用于清0,另外这个字节大小是手动保存的,因为这里是使用reallo追加的数组,使用sizeof获得是最初的大小

arr = (int *)memset(arr, 0, 40);//void*类型   1,内存清0的地址,2,清0, 3,字节大小

内存拷贝函数memcpy

#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);

功能:将src指向的空间n个字节 拷贝到dest指向的空间中
参数dest:目的空间的起始地址
参数src:源空间的起始地址
参数n:操作空间的字节数

 (int *)memcpy(arr2, arr, 40);

free释放堆区空间函数

void free(void *ptr);

使用堆区空间逻辑顺序,申请创建空间强制类型转换()、使用空间释放空间

注意事项:
1.为啥需要强制类型转换,因为 malloc,calloc创建最初始的空间类型都是void,不能直接进行使用;
2.malloc释放空间在有的系统或者编译软件清0,有的直接销毁,而calloc是直接清0,任何编译器更加稳定


http://www.mrgr.cn/news/47019.html

相关文章:

  • 代码随想录算法训练营第三十四天-动态规划-63. 不同路径II
  • Git-2-:Cherry-Pick 的使用场景及使用流程
  • 【python】OpenCV—Local Translation Warps
  • 虚假星标:GitHub上的“刷星”乱象与应对之道
  • linux-supervisor(进程控制系统)
  • 万物互联的背后:MCU嵌入式硬件的奇幻之旅
  • 基于 C# .NET Framework 4.0 开发实现 WCF 服务实例详解(一)
  • selenium获取cookie的方法
  • 基于遗传粒子群算法的无人机路径规划【遗传算法|基本粒子群|遗传粒子群三种方法对比】
  • 使用Facebook Messenger数据进行AI模型微调的完整指南
  • 软考系统分析师知识点七:数据库系统下
  • 探索新境界,尽在Codigger新版官网!
  • Llama-3.2-3B-Instruct PyTorch模型微调最佳实践
  • 9个热门.Net开源项目汇总!
  • 初学Qt之环境安装与 hello word
  • 洗衣店管理升级:Spring Boot订单系统
  • LeetCode518:零钱兑换
  • 【华为】默认路由配置
  • React(一) 认识React、熟悉类组件、JSX书写规范、嵌入变量表达式、绑定属性
  • ChinaER:重塑跨境互联新体验
  • 【Python脚本】getopt参数解析笔记
  • 【数据结构】顺序表
  • 推理实现new操作符
  • AI绘画Stable Diffusion XL优化终极指南!
  • CSS 命名规范及 BEM 在前端开发中的实践
  • 《网络基础之 HTML 与 CSS 基础 —— 网页的基本结构解析》