C语言 内存操作函数 +内存分区

news2024/9/29 21:20:23

内存操作函数

memset()
//memset 函数将指定内存区域 ptr 开始的 num 个字节设置为 value。
void *memset(void *ptr, int value, size_t num);

参数:
	ptr:指向要填充的内存区域的指针。
	value:要填充的值,以整数形式传递。
	num:要填充的字节数。
memcpy()
//memcpy 函数会将源内存区域 src 的前 n 个字节的内容复制到目标内存区域 dest 中。
void *memcpy(void *dest, const void *src, size_t n);
参数:
	dest:指向目标内存区域的指针,也就是要将源数据复制到的地方。
	src:指向源内存区域的指针,也就是要复制的数据来源。
	n:要复制的字节数。

为了防止内存重叠导致不确定的结果,建议源内存区域和目标内存区域不能重叠。

memmove()
//memmove 函数会将源内存区域 src 的内容移动到目标内存区域 dest 中,并且可以处理内存重叠的情况。
void *memmove(void *dest, const void *src, size_t n);
参数:
	dest:指向目标内存区域的指针,也就是要将数据移动到的地方。
	src:指向源内存区域的指针,也就是要移动的数据来源。
	n:要移动的字节数。

memmove 函数能够处理源内存区域和目标内存区域重叠的情况,以确保正确的数据移动。

memcmp()
//memcmp 函数会比较 ptr1 和 ptr2 指向的内存区域的前 num 个字节的内容,并根据比较结果返回一个整数值。
int memcmp(const void *ptr1, const void *ptr2, size_t num);
参数:
	ptr1:指向第一个内存区域的指针。
	ptr2:指向第二个内存区域的指针。
	num:要比较的字节数。
返回值:
如果 ptr1 的内容小于 ptr2 的内容,返回一个负整数。
如果 ptr1 的内容等于 ptr2 的内容,返回 0。
如果 ptr1 的内容大于 ptr2 的内容,返回一个正整数。

memcmp 函数是以字节为单位进行比较的,因此适用于比较任意类型的数据。但是,当比较字符串时,建议使用字符串比较函数 strcmp 来代替 memcmp,因为 strcmp 能够根据字符串的终止符’\0’自动确定比较的长度,而不需要显式指定比较的字节数。

堆内存的分配和释放 函数

malloc
//分配一块新的内存,不会初始化。
void* malloc(size_t size);
参数:
	size 表示欲分配的内存大小,以字节为单位。
返回值:
	成功,返回一个指向分配内存的指针
	失败,则返回 NULL

在实际开发中,使用 malloc 分配动态内存可以灵活地管理和利用内存资源,但也需要注意内存的释放和错误处理,以确保程序的正确性和健壮性。

calloc
//与 malloc 类似,用于分配指定数量的内存块。不同之处在于,calloc 还会将分配的内存块初始化为0。
void* calloc(size_t num, size_t size);
参数:
	num 表示欲分配的内存块数目
	size 表示每个内存块的大小(以字节为单位)
返回值:
	成功,返回一个指向分配内存的指针
	失败,则返回 NULL

使用 calloc 可以方便地分配内存,并初始化为零。在需要使用零初始化的情况下,calloc 是一个很有用的函数。

realloc
//用于重新分配已分配内存的大小
void* realloc(void* ptr, size_t size);
参数:
	ptr 是之前使用 malloc、calloc 或 realloc 函数分配的内存块的指针
	size 表示需要重新分配的内存大小(以字节为单位)
返回值:
	成功,返回一个指向重新分配后内存的指针
	失败,返回 NULL。
注意:	
	使用 realloc 重新分配内存后,返回的指针可能是原有内存的地址,也可能是新分配内存的地址,
	因此在重新分配内存后要基于返回的地址进行后续的处理。

使用 realloc 可以动态地调整已分配内存的大小,使其更适应程序的需求。在需要动态修改内存大小的情况下,realloc 是一个有用的函数。

free
//用于释放之前通过 malloc、calloc 或 realloc 分配的内存。
void free(void* ptr);

内存分区

32位系统的虚拟地址空间

在这里插入图片描述

每个进程的虚拟地址空间都是从0地址开始的,我们在程序中打印的变量地址也其在虚拟地址空间中的地址,程序是无法直接访问物理内存的。虚拟地址空间中用户区地址范围是 0~3G,里边分为多个区块:
在这里插入图片描述

其他

linux下 查看内存分区

在 Linux 下,可以在命令行中通过 size 命令查看二进制文件(可执行文件、静态库、动态库等)的大小和节(section)信息。

//基本语法
size [选项] [文件名]

在这里插入图片描述

解释:
text:代码段(可执行文件)或只读数据段(库文件)的大小。
data:已初始化数据段的大小。
bss:未初始化数据段(bss)的大小。
dec:代码段、数据段和bss段的总大小。
hex:十六进制表示的 dec 的大小。
filename:文件的名称。

在没有运行程序前,也就是说程序没有加载到内存前,可执行程序内部已经分好3段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分(有些人直接把 data 和 bss 合起来叫做静态区或全局区)。

详细教程可转

爱编程的大丙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1309336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专题地图制作与布局编辑

一、实验名称: 专题地图制作与布局编辑 二、实验目的: 通过本实验练习,掌握ARCGIS专题地图制作与布局编辑。 三、实验内容和要求: 实验内容: 利用ARCGIS软件相关分析工具及实验数据,制作专题地图&…

MySQL索引_什么是索引_索引的分类_什么时候需要/不需要创建索引_优化索引_索引失效

文章目录 索引1. 什么是索引2. 索引的分类按数据结构分类按物理存储分类按字段特性分类按字段个数分类 3. 什么时候需要 / 不需要创建索引?什么时候适用索引?什么时候不需要创建索引? 4. 优化索引的方法前缀索引优化覆盖索引优化主键索引最好…

迅腾文化助力企业品牌创新,加快增强品牌发展新动能

迅腾文化助力企业品牌创新,加快增强品牌发展新动能 随着市场竞争的日益激烈,品牌创新已成为企业持续发展的关键。为了在市场中脱颖而出,许多企业纷纷寻求外部合作伙伴以加快品牌发展。广州迅腾文化传播有限公司拥有13年品宣经验的企业&#…

迪文屏图标控件保姆级教程

要主图的去末尾,末尾福利图在等着你~~~ 文章目录 前言 开发环境 二、使用步骤 1.添加图标控件 2.设置图标属性 3.图标库ICL文件生成 4.单片机程序编写 容易踩得坑 一、前言 本篇文章主要介绍了在DGBUS平台上使用图标变量的步骤。首先需要在DGBUS中添加一个图标变量控…

【教学类-35-07】正方形折纸上的学号描字帖(15*15CM1份)

背景需求: 尝试将加减法题目打印在手工纸上,写完书写题后,反面绘画,最后折纸。 用同样的思路,在15*15CM正方形手工纸上做一套幼儿学号描字帖 素材准备 WORD模板(纸张长宽15*15CM,边距上下左右0&…

【源码解析】从Conditon角度聊聊AQS原理

前几篇文章,我们详细描述了线程池的原理以及核心代码,以及阻塞队列,ReentrantLock的核心流程,本篇主要介绍下lock锁中的condition 公平锁和非公平锁 public ReentrantLock() {sync new NonfairSync();}public ReentrantLock(boo…

Liunx系统挂载磁盘

1.具体步骤 大概五个步骤 添加磁盘磁盘分区格式化分区挂载分区到指定目录设置开机自动挂载 目标将sdb1分区挂载到/data目录 2.添加磁盘 使用lsblk -f命令可以查看当前系统磁盘情况 lsblk -f 可以看到已经有一个磁盘sda,现在我们给虚拟机增加一个磁盘 添加完成后…

五、Java核心数组篇

1.数组 概念: ​ 指的是一种容器,可以同来存储同种数据类型的多个值。 ​ 但是数组容器在存储数据的时候,需要结合隐式转换考虑。 比如: ​ 定义了一个int类型的数组。那么boolean。double类型的数据是不能存到这个数组中的&…

什么台灯好用不伤眼睛?适合考公使用的台灯推荐

随着时代的发展与进步,不管是办公族还是学生党的压力也越来越大的,不少人在晚上回去之后仍然需要学习、工作,这样的一件试几乎成为了“家常便饭”,而这个过程中必不可少就是台灯。有些人为了保护眼睛会选择护眼台灯,但…

考研护眼台灯怎么选好?2023考研党台灯分享

现在随着生活水平的提升,孩子的教育也越好越好了,不过随之而来的就是繁重的学习压力,和做不完的作业。细心的家长可能已经发现,自从孩子步入高年级之后,晚上回到家完成作业的时间也越来越长了,这不得不让身…

OfficeWeb365 SaveDraw 文件上传漏洞复现

0x01 产品简介 OfficeWeb365 是专注于 Office 文档在线预览及PDF文档在线预览云服务,包括 Microsoft Word 文档在线预览、Excel 表格在线预览、Powerpoint 演示文档在线预览,WPS 文字处理、WPS 表格、WPS 演示及 Adobe PDF 文档在线预览。 0x02 漏洞概述 OfficeWeb365 Sav…

面相对象开发的原则

1、开闭原则 对修改关闭,对扩展打开。 2、里氏替换原则 子类继承父类的方法时,不可重写父类的方法。 如果重写了父类的方法会导致整个继承体系比较差,特别是运用多态比较平凡时,程序运行出错概率较大。 如果出现了违背“里氏替换…

力扣105与106从前序与中序(中序与后序)遍历序列构造二叉树

本题刚接触时比较懵,做出来后就很好理解。之前数据结构的题:给出中序与后序(或前序与中序)画出该树 无从下笔不知如何去画,做完此题后就发现豁然开朗,不过尔尔。本题只讲中序与后序(前序与中序一…

【设计模式--行为型--命令模式】

设计模式--行为型--命令模式 命令模式定义结构案例优缺点使用场景 命令模式 定义 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储,传递,调用…

cpp:1:10: fatal error: opencv2/core.hpp: 没有那个文件或目录

前言&#xff1a; 我按照官网方法安装了opencv&#xff0c;运行的也是官网的测试代码&#xff1a; #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> using namespace cv; int main() {printf("hello world")return 0; } 半解决&#xff…

TCP/IP详解——TCP 协议

文章目录 一、传输层协议1. TCP1.1 TCP 的字节流1.2 TCP 端口号1.3 TCP 头部1.4 TCP 选项部分字段1.5 TCP 三次握手1.6 TCP 三次握手不成功1.6.1 TCP 拒绝&#xff08;被RST重置&#xff09;1.6.2 TCP 半连接1.6.3 TCP 连接无响应 1.7 TCP 传输过程及原理1.7.1 TCP 传输过程1.7…

高通开发系列 - 功耗问题之添加CPU Idle和Hotplug的功能

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 概述CPU IdleCPU TopologyCPU Idle DriverCPU Idle GovernorCPU的hotplug函数

给我说说Redis持久化机制RDB吧

基础 了解过Redis持久化RDB嘛&#xff1f;可不可以解释一下什么是RDB。 答&#xff1a; RDB持久化机制是将内存中的数据生成快照并持久化到磁盘的过程&#xff0c;RDB可以通过手动或者自动的方式实现持久化。 那RDB触发的方式有哪几种方式知道吗&#xff1f; 答: 有两种&am…

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(三)日志管理(登录日志、操作日志)、用户登录模块

第一篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;一&#xff09;搭建项目 第二篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;二&#xff09;日志输出中间件、校验token中间件、配置路由、基础工具函数。 …

赛氪为第五届全球校园人工智能算法精英大赛决赛选手保驾护航

12月10日&#xff0c;以“智青春算未来”为主题的2023年第五届全球校园人工智能算法精英大赛全国总决赛在河海大学江宁校区举行。本次大赛由江苏省人工智能学会主办&#xff0c;自9月份启动以来&#xff0c;共吸引了全国近400所高校的3000多支参赛团队参加。经过校赛、省赛选拔…