c进阶篇(四):内存函数

内存函数以字节为单位更改

1.memcpy

memcpy 是 C/C++ 中的一个标准库函数,用于内存拷贝操作。它的原型通常定义在 <cstring> 头文件中,其作用是将一块内存中的数据复制到另一块内存中。

函数原型:void *memcpy(void *dest, const void *src, size_t n);

在 C++ 中,memcpy 函数也可以直接使用,但推荐使用类型安全的 std::memcpy,原型也在 <cstring> 头文件中声明:void* memcpy(void* dest, const void* src, size_t n);

参数解释

  • dest:目标内存的起始地址,即要将数据复制到的位置。

  • src:源内存的起始地址,即要从哪里复制数据。

  • n:要复制的字节数。

功能

memcpy 函数的作用是将 src 指向的内存区域的前 n 个字节复制到 dest 指向的内存区域。这意味着它能够高效地复制大块内存数据,常用于数组和结构体等数据结构的复制操作。

使用示例:

模拟实现:

void * memcpy ( void * dst, const void * src, size_t count)
{void * ret = dst;assert(dst);assert(src);/** copy from lower addresses to higher addresses*/while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}return(ret);
}

注意事项

  • memcpy 不会检查内存的边界,因此在使用时要确保 dest 和 src 指向的内存区域不会发生重叠,否则结果将是不确定的。要处理可能重叠的情况,可以使用 memmove 函数。
  • 在 C++ 中,使用 std::memcpy 可以更好地与命名空间和重载机制配合,避免潜在的命名冲突。

2.memmove

在 C 语言中,memmove 的原型如下:void *memmove(void *dest, const void *src, size_t n);

在 C++ 中,memmove 函数同样可以直接使用,也推荐使用 std::memmove,其原型在 <cstring> 头文件中声明:void* memmove(void* dest, const void* src, size_t n);

参数解释

  • dest:目标内存的起始地址,即要将数据复制到的位置。

  • src:源内存的起始地址,即要从哪里复制数据。

  • n:要复制的字节数。

功能

memmove 函数与 memcpy 类似,都是将 src 指向的内存区域的前 n 个字节复制到 dest 指向的内存区域。不同的是,memmove 能够正确处理 destsrc 指向的内存区域有重叠的情况。具体来说,memmove 保证复制的结果是正确的,无论 srcdest 是否有重叠部分。

使用示例:

模拟实现:

void * memmove ( void * dst, const void * src, size_t count)
{void * ret = dst;if (dst <= src || (char *)dst >= ((char *)src + count)) {while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}}else {dst = (char *)dst + count - 1;src = (char *)src + count - 1;while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst - 1;src = (char *)src - 1;}}return(ret);
}

注意事项

  • memmove 比 memcpy 的实现可能会稍慢,因为它必须确保在处理重叠的情况下也能正确复制数据。
  • 如果确定 src 和 dest 不会重叠,使用 memcpy 可能更为高效。

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

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

相关文章

多模态融合算法应用:CT + 临床文本数据 + pyradiomics提取到的图像特征

多模态融合算法应用 CT 临床文本数据 pyradiomics提取图像特征 单模态建模临床数据建模pyradiomics提取图像特征建模CT建模 多模态建模前融合为什么能直接合并在一起&#xff1f; 后融合Med-CLIP&#xff1a;深度学习 可解释性 单模态建模 临床数据建模 临床文本数据&…

WPF Menu实现快捷键操作

很多小伙伴说&#xff0c;在Menu中&#xff0c;实现单个快捷键操作很简单&#xff0c;怎么实现多个快捷键操作和&#xff0c;组合快捷键呢&#xff0c;今天他来了。 上代码和效果图 一、Ctrl Shift 任意子母键实现快捷键组合 <Window x:Class"XH.TemplateLesson.M…

【测试开发】【postman】按顺序循环执行接口

postman按顺序循环执行接口 新建接口接口排序执行请求集合 新建接口 Request 001 Request 002 Request 003 接口排序 在Request 001的Tests中添加代码 postman.setNextRequest("Request 002");在Request 002的Tests中添加代码 postman.setNextRequest("Requ…

Redis 7.x 系列【17】四种持久化策略

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 案例演示2.1 无持久化2.2 RDB2.3 AOF2.4 混合模式2.4.1 方式一&#xff1a;…

线性代数|机器学习-P21概率定义和Markov不等式

文章目录 1. 样本期望和方差1.1 样本期望 E ( X ) \mathrm{E}(X) E(X)1.2 样本期望 D ( X ) \mathrm{D}(X) D(X) 2. Markov 不等式&Chebyshev不等式2.1 Markov不等式公式 概述2.2 Markov不等式公式 证明&#xff1a;2.3 Markov不等式公式 举例&#xff1a;2.4 Chebyshev不…

AI绘画 Stable Diffusion图像的脸部细节控制——采样器全解析

大家好&#xff0c;我是画画的小强 我们在运用AI绘画 Stable Diffusion 这一功能强大的AI绘图工具时&#xff0c;我们往往会发现自己对提示词的使用还不够充分。在这种情形下&#xff0c;我们应当如何调整自己的策略&#xff0c;以便更加精确、全面地塑造出理想的人物形象呢&a…

域环境提权

域内提权漏洞(1) Netlogon域权限提升 1.查看域控主机名称 net group "domain controllers" /domain 2.检测漏洞是否存在 https://github.com/SecuraBV/CVE-2020-1472.git python zerologon_tester.py OWA 192.168.52.138 3.漏洞利用&#xff0c;对域账号重置 ht…

《简历宝典》01 - 一文带你学会如何写一份糟糕透顶的简历

我们每个人几乎都会面对找工作这件事&#xff0c;而找工作或者说求职首先就是要写一份简历。今天狗哥将以一个不同的视角带你写一份无与伦比&#xff0c;糟糕透顶的求职简历&#xff0c;说实话&#xff0c;其实几年前&#xff0c;我就是这么写的。 目录 1. 文件名 2. 基本信…

【项目管理】项目风险管理(Word原件)

风险和机会管理就是在一个项目开发过程中对风险进行识别、跟踪、控制的手段。风险和机会管理提供了对可能出现的风险进行持续评估&#xff0c;确定重要的风险机会以及实施处理的策略的一种规范化的环境。包括识别、分析、制定处理和减缓行动、跟踪 。合理的风险和机会管理应尽力…

白骑士的Python教学进阶篇 2.4 高级数据结构

系列目录 上一篇&#xff1a;白骑士的Python教学进阶篇 2.3 文件操作​​​​​​​ 在Python中&#xff0c;掌握高级数据结构可以显著提升你的编程效率和代码可读性。高级数据结构包括列表推导式、生成器与迭代器以及装饰器。本文将详细介绍这些高级数据结构&#xff0c;帮助…

算法刷题1-10大排序算法汇总

十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。非比较类排序&#xff1a;不通过比较来决定元素间的相对次序&#xff0c;它可…

服务器安装Nginx教程

1、安装所需依赖 yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 2、创建nginx目录并下载Nginx安装包 //进入/usr/local cd /usr/local//创建nginx目录 mkdir nginx//进入nginx目录 cd nginx//下载nginx tar包 wget http://…

Lesson 47 A cup of coffee

Lesson 47 A cup of coffee 词汇 like v. 喜欢&#xff0c;想要 用法&#xff1a;like 物品 / 人 喜欢……    like 动词ing 喜欢做……&#xff08;习惯性&#xff09;    like to 动词原形 喜欢做……&#xff08;一次性&#xff09; 例句&#xff1a;我喜欢小狗…

[leetcode hot 150]第五百三十题,二叉搜索树的最小绝对差

题目&#xff1a; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 解析&#xff1a; minDiffInBST 方法是主要方法。创建一个 ArrayList 来存储树的节点值。inorderTrave…

前端日常扫盲

一、js标签语句 直接上代码 for(let i 0; i < 10; i){console.log("顶层循环");for(let j 0; j < 10; j){console.log("内层循环",i,j);if(i * j > 30){console.log("退出顶层循环");break;}} }如上面的代码&#xff0c;双层循环&a…

opencv-yolo-tiny车辆检测 ----20240705

opencv-yolo-tiny 实现车辆检测 opencv.dnn模块已经支持大部分格式的深度学习模型推理,该模块可以直接加载tensorflow、darknet、pytorch等常见深度学习框架训练出来的模型,并运行推理得到模型输出结果。opecnv.dnn模块已经作为一种模型部署方式,应用在工业落地实际场景中。…

持续交付:自动化测试与发布流程的变革

目录 前言1. 持续交付的概念1.1 持续交付的定义1.2 持续交付的核心原则 2. 持续交付的优势2.1 提高交付速度2.2 提高软件质量2.3 降低发布风险2.4 提高团队协作 3. 实施持续交付的步骤3.1 构建自动化测试体系3.1.1 单元测试3.1.2 集成测试3.1.3 功能测试3.1.4 性能测试 3.2 构建…

(一)进程与线程

一、进程和线程的概念 1.1 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个…

鸿蒙系统的开发与学习

1.开发工具的下载 DevEco Studio-HarmonyOS Next Beta版-华为开发者联盟 安装、环境配置时&#xff0c;建议 自定义目录 注意&#xff1a;路径中不要有 中文、特殊字符。 2.ArkTS基础总结 1&#xff09;三种数据类型 ① string 字符串&#xff1a;描述信息 ② number 数…

银联快捷支付的优点!

快速支付&#xff0c;又称电子支付或第三方支付&#xff0c;在行业中得到了广泛的应用。用户只需通过银行完成交易。方便快捷是指银行可以在任何条件下支持用户之间的转账、支付等即时结算服务。快速支付是指用户可以通过手机实现银行卡等相关操作。然而&#xff0c;现在大多数…