【C/C++】C语⾔内存函数
C语言内存函数
1. memcpy使用和模拟实现
memcpy可以代替strcpy
void * memcpy ( void * destination, const void * source, size_t num );//void*来接受任意指针,size_t 单位是字节
//memcpy的头文件为<string.h> mem是memory的缩写 是内存的意思
功能:
• memcpy 是完成内存块拷⻉的,不关注内存中存放的数据是啥**(遇到‘\0’不会停)**
• 函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存位置。
• 如果 source 和 destination 有任何的重叠,复制的结果都是未定义的。
◦ (内存重叠的情况使⽤ memmove 就⾏)
• memcpy 的使⽤需要包含<string.h>
参数:
destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥
source :指针,指向源空间,要拷⻉的数据从这⾥来
num :要拷⻉的数据占据的字节数
返回值:
拷⻉完成后,返回⽬标空间的起始地址
1.1 代码演示
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);//20字节int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}
1.2 模拟实现
void * memcpy ( void * dst, const void * src, size_t count)//dst要变 src不变
{void * ret = dst;//记录初始位置assert(dst);assert(src);/** copy from lower addresses to higher addresses*/while (count--) {*(char *)dst = *(char *)src;//强转成char* 一次换一个字节dst = (char *)dst + 1;//(char* dst)++src = (char *)src + 1;//(char* src)++}return(ret);
}
那这时候就有人问了?
有重叠的 如 memcpy(arr1+2,arr1,20) 会发生什么情况
3和4被1 2替换后 5会被红色的1替代 从而达不到想要的效果
所以来看接下来函数
2. memmove使用和模拟实现
void * memmove ( void * destination, const void * source, size_t num );
功能:
• memmove函数也是完成内存块拷⻉的
• 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
• memmove的使⽤需要包含<string.h>
参数:
destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥
source :指针,指向源空间,要拷⻉的数据从这⾥来
num :要拷⻉的数据占据的字节数
返回值:
拷⻉完成后,返回⽬标空间的起始地址
2.1 代码演示
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);//arr1+2就是数组中3的位置 20=4*sizeof(int)int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
输出的结果:
1 2 1 2 3 4 5 8 9 10
2.2 模拟实现
此种情况可以先把5移动到7 然后4移动到6 也就是从后往前
此种情况可以把先把3移动到1处 以此类推
我们可以得出结论 当dest在src左边时 是从前往后
当dest在src右边时 是从后往前
不重叠是都可以
void* memmove(void* dst, const void* src, size_t count)
{void* ret = dst;//要返回起始空间if (dst < src) {/** Non-Overlapping Buffers* copy from lower addresses to higher addresses*/while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {/** Overlapping Buffers* copy from higher addresses to lower addresses*/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);
}
void* memmove(void* dst, const void* src, size_t count)
{void* ret = dst;//要返回起始空间if (dst < src) {/** Non-Overlapping Buffers* copy from lower addresses to higher addresses*/while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {while(count--)//count=20{((char*)dest+count)=*((char*)src+count);//count=19}}}return(ret);
}
3. memset函数的使用
void * memset ( void * ptr, int value, size_t num );
功能:
• memset 函数是⽤来设置内存块的内容的,将内存中指定⻓度的空间设置为特定的内容。
• memset 的使⽤需要包含 <string.h>
参数:
ptr :指针,指向要设置的内存空间,也就是存放了要设置的内存空间的起始地址。
value :要设置的值,函数将会把 value 值转换成 unsigned char 的数据进⾏设置的。也就是以字节为单位来设置内存块的。
num :要设置的内存⻓度,单位是字节。
**返回值:**返回的是要设置的内存空间的起始地址。
3.1 代码演示
#include <stdio.h>
#include <string.h>
int main ()
{char str[] = "hello world";memset (str,'x',6);//以字节为单位printf(str);return 0;
}
输出的结果:
xxxxxxworld
3.2 总结:
当有⼀块内存空间需要设置内容的时候,就可以使⽤memset函数,值得注意的是memset函数对内存 单元的设置是以字节为单位的。
4. memcmp函数的使用
内存块比较
int memcmp ( const void * ptr1, const void * ptr2, size_t num );//因为是void* 所以任何类型都能比较 strcmp只能比较字符串
功能:
⽐较指定的两块内存块的内容,⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节 memcmp 的使⽤需要包含 <string.h>
参数:
ptr1 :指针,指向⼀块待⽐较的内存块
ptr2 :指针,指向另外⼀块待⽐较的内存块
num :指定的⽐较⻓度,单位是字节
返回值:
4.1 代码演示
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7 };int arr2[] = { 1,2,3,4,8,8,8 };int n = memcmp(arr1, arr2, 17);//比较17个字节 vs中是大端储存 比较的时候到了第17字节 arr1是05 arr2是08printf("%d\n", n);return 0;
}
4.2 总结
如果要⽐较2块内存单元的数据的⼤⼩,可以使⽤ memcmp 函数,这个函数的特点就是可以指定⽐较 ⻓度。 memcmp 函数是通过返回值告知⼤⼩关系的。
相关文章:
【C/C++】C语⾔内存函数
C语言内存函数 1. memcpy使用和模拟实现 memcpy可以代替strcpy void * memcpy ( void * destination, const void * source, size_t num );//void*来接受任意指针,size_t 单位是字节 //memcpy的头文件为<string.h> mem是memory的缩写 是内存的意思功能: …...
SQL JOIN 关联条件和 where 条件的异同
Inner join 对于 inner join,条件写到 on 和 where 部分是一样的。 select count(1) from web_site join web_page on web_site_skwp_web_page_id where web_cityPleasant Hill and wp_access_date_sk1;输出 0select count(1)from web_site join web_page on web…...
kotlin 数据类
一 kotlin数据类与java普通类区别 Kotlin 的 data class 与 Java 中的普通类(POJO)相比,确实大大减少了样板代码(boilerplate),但它的优势不止于自动生成 getter/setter、copy()、equals()、toString()&am…...
云效 MCP Server:AI 驱动的研发协作新范式
作者:黄博文、李晔彬 云效 MCP Server 是什么? 云效 MCP(Model Context Protocol)是阿里云云效平台推出的模型上下文协议标准化接口系统,作为连接 AI 助手与 DevOps 平台的核心桥梁,通过模型上下文协议将…...
复合机器人案例启示:富唯智能如何以模块化创新引领工业自动化新标杆
在国产工业机器人加速突围的浪潮中,富唯智能复合机器人案例凭借其高精度焊接与智能控制技术,成为行业标杆。然而,随着制造业对柔性化、全场景协作需求的升级,复合机器人正从单一功能向多模态协同进化。作为这一领域的创新者&#…...
信息系统项目管理师-软考高级(软考高项)2025最新(十三)(1)
个人笔记整理---仅供参考 信息系统项目理师-软考高级(软考高项)2025最新(十三)(1)第十三章项目资源管理 13.0资源管理概述 13.1管理基础 团队发展阶段背下来 13.2项目资源管理过程 13.3规划资源管...
archlinux 详解系统层面
Arch Linux 深度解析:从设计哲学到系统架构 一、Arch Linux 概述:滚动发行的极客之选 Arch Linux 是一款以 滚动更新(Rolling Release) 为核心特性的 Linux 发行版,强调 轻量、灵活、高度可定制,旨在让用…...
⭐️⭐️⭐️【课时1:大模型是什么?】学习总结 ⭐️⭐️⭐️ for《大模型Clouder认证:基于百炼平台构建智能体应用》认证
一、学习目标 概要 通过学习《课时1:大模型是什么?》,全面了解大模型的基础概念、核心特点、发展脉络及阿里云在大模型领域的布局,为后续基于百炼平台构建智能体应用的实践操作打下坚实的理论基础。 具体目标列表 理解人工智能到大模型的演变逻辑,明确大模型在AI发展历…...
qxl显卡与spice模块笔记
1、qxl虚拟显卡设备创建QemuConsole,并保存在全局变量consoles链表中。 static void qxl_realize_primary(PCIDevice *dev, Error **errp) {PCIQXLDevice *qxl PCI_QXL(dev);VGACommonState *vga &qxl->vga;Error *local_err NULL;qxl_init_ramsize(qxl)…...
Rust 官方文档:人话版翻译指南
鉴于大部分翻译文档都不太会说人话,本专栏主要内容为 rust 程序设计语言、rust 参考手册、std 库 等官方文档的中译中。...
切比雪夫不等式专题习题解析
切比雪夫不等式专题习题解析 前言 本文为概率论习题集专栏的切比雪夫不等式专题习题解析,针对习题篇中的10道题目提供详细解答。希望通过这些解析帮助大家深入理解切比雪夫不等式的应用和意义。 一、基础概念题解析 习题1解析: 错误。切比雪夫不等式适用于任何具有有限方…...
LearnOpenGL01:创建项目
基于LearnOpenGL 相关链接: 工程搭建 hello window 环境 UBUNTU GLFW3.3:负责创建窗口处理输入 GLAD:根据不同操作系统加载不同的OPENGL函数实现 安装GLFW以及编译项 sudo apt update sudo apt install cmake build-essential libglfw3-…...
基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》开发者说明文档
real_data_model.m 开发者说明文档 脚本概述 本MATLAB脚本实现了基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》(鲍志远,胡泽春)中提出的预测模型和评估方法。脚本使用真实的充电数据、天气数据和分时电价数据,实现了LSTM与线性模型混合…...
优雅草星云智控系统产品发布会前瞻:SNMP协议全设备开启指南-优雅草卓伊凡
优雅草星云智控系统产品发布会前瞻:SNMP协议全设备开启指南-优雅草卓伊凡 一、发布会重磅预告 1.1 星云智控系统发布会详情 优雅草科技将于2024年5月15日在成都市双流区天府国际生物城会议中心举办”星云智控系统产品发布会“。作为优雅草科技CTO,卓伊…...
【Python】Pycharm中安装库可靠的方法
博主需要在pycharm中安装Python需要的库,发现可以通过两个方法,一个是在terminal中安装,如下图: 另一个,是通过软件包安装。 博主发现,保险起见,还是通过软件包安装会比较稳妥。博主遇见一个库&…...
探索Stream流:高效数据处理的秘密武器
不可变集合 stream流 Stream流的使用步骤: 先得到一条Stream流(流水线),并把数据放上去 使用中间方法对流水线上的数据进行操作 使用终结方法对流水线上的数据进行操作 Stream流的中间方法 注意1:中间方法࿰…...
Debezium RelationalSnapshotChangeEventSource详解
Debezium RelationalSnapshotChangeEventSource详解 1. 类的作用与功能 1.1 核心功能 RelationalSnapshotChangeEventSource是Debezium中用于关系型数据库快照的核心抽象类,主要负责: 数据快照:对数据库表进行全量数据快照模式捕获:捕获数据库表结构事务管理:确保快照过…...
Open CASCADE学习|实现裁剪操作
1. 引言 Open CASCADE (简称OCC) 是一个功能强大的开源几何建模内核,广泛应用于CAD/CAM/CAE领域。裁剪操作作为几何建模中的基础功能,在模型编辑、布尔运算、几何分析等方面有着重要作用。本文将全面探讨Open CASCADE中的裁剪操作实现原理、应用场景及具…...
Microsoft Azure DevOps针对Angular项目创建build版本的yaml
Azure DevOps针对Angular项目创建build版本的yaml,并通过变量控制相应job的执行与否。 注意事项:代码前面的空格是通过Tab控制的而不是通过Space控制的。 yaml文件中包含一下内容: 1. 自动触发build 通过指定code branch使提交到此代码库的…...
Navicat 17最新保姆级安装教程(附安装包+永久使用方法)
前言 Navicat Premium 是一套可创建多个连接的数据库开发工具,让你从单一应用程序中同时连接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 。它与 OceanBase 数据库及 Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Orac…...
在 Kotlin 中什么是委托属性,简要说说其使用场景和原理
在 Kotlin 中,属性委托和类委托是两种通过 by 关键字实现的强大特性,它们通过“委托”机制将行为或实现逻辑委托给其他对象,从而实现代码的复用和解耦。 1 属性委托 定义: 允许把属性的 get 和 set 方法的具体实现委托给另一个对…...
[Windows] 东芝存储诊断工具1.30.8920(20170601)
[Windows] 东芝存储诊断工具 链接:https://pan.xunlei.com/s/VOPpMjGdWZOLceIjxLNiIsIEA1?pwduute# 适用型号 东芝消费类存储产品: 外置硬盘:Canvio 系列 内置硬盘:HDW****(E300 / N300 / P300 / S300 / V300 / X30…...
按位段拼接十六进制
需求: 给一组位段及对应的值,拼接出该十六进制值。 如, [15] : 0x1 [31:16] : 0xfafa [14:1] : 0x1af0 [0:0] : 0x1 def parse_range(range_str):"""解析位段字符串,返回高位和低位"""parts…...
FPGA 41 ,ICMP 协议详细解析之构建网络诊断系统( ICMP 协议与 IP 协议理论详细解析 )
目录 前言 一、ICMP协议介绍 1.1 ICMP协议介绍 1.2 ICMP报文格式 1.3 ICMP地位流程 1.4 为何需要ICMP差错报文 1.5 协议关系 二、FPGA 与 ICMP 2.1 平台选择与环境搭建 2.2 模块化设计 2.3 ICMP 功能设计 (1)ICMP 报文解析 (2&am…...
每天批次导入 100 万对账数据到 MySQL 时出现死锁
一、死锁原因及优化策略 1.1 死锁原因分析 批量插入事务过大: Spring Batch 默认将整个 chunk(批量数据块)作为一个事务提交,100 万数据可能导致事务过长,增加锁竞争。 并发写入冲突: 多个线程或批处理作…...
滑动窗口-窗口中的最大/小值-单调队列
求窗口的最大值 #include <iostream> //滑动窗口最大值用单调队列q[],q存储候选最大值的下标 //队列头是最大值的下标 using namespace std; const int N100010; int nums[N],q[N]; int hh0,tt-1;// hh 是队头指针,tt 是队尾指针,初始…...
Docker Compose 部署 MeiliSearch 指南
Docker Compose 部署 MeiliSearch 指南 目录 环境准备创建 MeiliSearch 配置文件启动 MeiliSearch 服务验证服务状态访问 MeiliSearch安全及防火墙设置...
在 MyBatis 中实现控制台输出 SQL 参数
在 MyBatis 中实现控制台输出 SQL 参数,可通过以下方案实现: # 一、使用 MyBatis-Plus 的 SqlLogInterceptor(推荐) 适用场景:项目已集成 MyBatis-Plus(3.5.3版本) 配置步骤ÿ…...
【MySQL】数据库、数据表的基本操作
个人主页:Guiat 归属专栏:MySQL 文章目录 1. MySQL基础命令1.1 连接MySQL1.2 基本命令概览 2. 数据库操作2.1 创建数据库2.2 查看数据库2.3 选择数据库2.4 修改数据库2.5 删除数据库2.6 数据库备份与恢复 3. 表操作基础3.1 创建表3.2 查看表信息3.3 创建…...
Java中的内部类详解
目录 什么是内部类? 生活中的内部类例子 为什么需要内部类? 生活中的例子 内部类的存在意义 内部类的分类 1. 成员内部类 什么是成员内部类? 成员内部类的特点 如何使用成员内部类? 成员内部类访问外部类同名成员 2. …...
【LangChain全栈开发指南】从LLM集成到智能体系统构建
目录 🌟 前言🏗️ 技术背景与价值💢 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🔍 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🧩 关键技术模块说明⚖️ 技术选…...
《内存单位:解锁数字世界的“度量衡”》
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、基础单位:字节(Byte)二、进阶单位:千字节(KB)、兆字节(MB)…...
Spring Boot + MyBatis-Plus 高并发读写分离实战
引言 在高并发场景下,单一数据库实例往往成为性能瓶颈。数据库读写分离通过将读操作和写操作分配到不同的数据库实例,有效缓解主库压力,提升系统吞吐量。MyBatis-Plus 作为一款强大的持久层框架,结合 Spring Boot 能够轻松实现读…...
STC32G12K128-旋转编码器-软件去抖
STC32G12K128-旋转编码器-软件去抖 简介代码 简介 EC11旋转编码器是一种可以连续旋转的器件A,B,C为旋转编码引脚,带按键的有D,E引脚。引脚功能: A:编码器A相;B:编码器B相;C:公共端-一般接到GN…...
第J7周:对于ResNeXt-50算法的思考
目录 思考 一、代码功能分析 1. 构建 shortcut 分支(残差连接的旁路) 2. 主路径的第一层卷积(11) 4. 主路径的第三层卷积(11) 5. 残差连接 激活函数 二、问题分析总结:残差结构中通道数不一致的…...
古方焕新潮!李良济盒马联名养生水,以创新赋能中式养生新潮流
今天下午,中华老字号李良济与新零售巨头盒马联名的“五汁饮&暑清元气水”新品发布会,在李良济隆重举行。 新品发布会上,盒马与多家媒体齐聚李良济,通过中医文化体验、新品品鉴、生产全链路探秘、媒体采访等环节,不…...
使用PyTorch训练马里奥强化学习代理的完整指南
以下是使用PyTorch训练马里奥强化学习代理的完整指南,涵盖依赖库配置、环境搭建、核心代码实现及输出结果分析,结合关键优化策略与实战经验。 一、依赖库配置 基础环境安装 # 使用Anaconda创建虚拟环境(推荐) conda create -n m…...
STM32F103RCT6 + MFC实现网口设备搜索、修改IP、固件升级等功能
资源下载链接:https://download.csdn.net/download/qq_35831134/90712875?spm=1001.2014.3001.5501 一.大概逻辑: // 网口搜索大概逻辑: // ************************************************************************** // 一.环境: // 上位机用MFC下位机用STM32F103R…...
ch09 课堂参考代码
ch09 拓扑排序与基环树 拓扑排序 在一些场景中,需要完成一系列事情,这些事情之间有顺序关系或者依赖关系,在做一件事情之前必须先做另一件事,例如课程学习的先后顺序,这类问题可以抽象为图论中的拓扑排序问题。 拓扑…...
Day 15 训练
Day 15 对鸢尾花数据集进行处理,特征可视化,贝叶斯优化随机森林,Shap解释1. 导入必要的库2. 设置中文字体3. 加载数据集4. 查看数据5. 数据准备6. 贝叶斯优化随机森林7. 评估结果8. 绘制箱形图9. 绘制特征相关性热力图10. SHAP模型解释总结 对…...
Path to Integer_ABC402分析与解答
考虑怎么降低复杂度,使用分治策略降低搜索的复杂度。 对于a_i,j,其一定在最后结果数的第(2n-i-j)位(如果将最低位看成第0位),故将a_i,j看成a_i,j * 10^(2n-i-j),这样每次加上a_i,j就可以了。 从(1,1)到(n…...
嵌入式学习笔记 - 关于结构体成员地址对齐问题
一 在没有#pragma pack()这个宏声明的情况下 C语言中结构体成员分配内存大小时需要满足2个条件,这也是内存对齐的原则: ①每个成员变量的起始地址必须为其数据类型所占空间大小的整数倍 ②结构体所占空间总大小为其最大数据类…...
JAVA实战开源项目:健身房管理系统 (Vue+SpringBoot) 附源码
本文项目编号 T 180 ,文末自助获取源码 \color{red}{T180,文末自助获取源码} T180,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
升级element-ui步骤
1 执行 cnpm uninstall element-ui 删除element-ui依赖2 执行 cpm install element-ui -S 安装最新的element-ui,并加入到packjson中3 在element-ui中生成主题,并将主题文件加入到element-ui-theme中。删除所有旧版本到主题文件 *4 修改element-ui-theme…...
Dp通用套路(闫式)
闫式dp分析法: 从集合角度来分析DP问题。 核心思想: DP是一种求有限集中的最值或者个数问题 由于集合中元素的数量都是指数级别的,直接用定义去求,把每种方案都用dfs暴力枚举一遍,时间复杂度很高,此时用…...
如何删除豆包本地大模型
由于无法选择大模型的安装位置,因此会占用C盘大量空间,然后又找到不卸载的地方,经排查豆包大模型安装位为:C:\Users\[当前电脑用户]\AppData\Local\Doubao\User Data,只能进行手动卸载。...
在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置
在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置如下图所示 将DemClearDTCLimitation参数改成DEM_ALL_SUPPORTED_DTCS 此时0x14 服务就可以支持单个DTC的故障清除, 如果配置成 DEM_ONLY_CLEAR_ALL_DTCS 则只能够用0x14服务清楚所有DTC。...
Linux59 SSH配置前瞻 JumpServer双网卡ping通
为什么Ping这个IP地址Ping得通 本地址 [rootlocalhost network-scripts]# cat ifcfg-ens33 iTYPEEthernet BOOTPROTOnone DEFROUTEyes DEVICEens33 ONBOOTno IPADDR192.168.235.4 NETMASK255.255.255.0 GATEWAY192.168.235.2 DNS1114.114.114.114 [rootlocalhost network-scrip…...
TensorFlow中数据集的创建
目录 前言示例示例1示例2示例3示例4 前言 TensorFlow 的 tf.data.Dataset API 提供了一种灵活且高效的方式来加载和预处理数据。它可以轻松处理大规模数据集,并支持多种数据源格式。 所有数据集相关的内容都在tf.data中,from_tensor_slices:…...
OpenHarmony SystemUI开发——实现全局导航栏和状态栏关闭
在实际生产中,进场遇到需要关闭导航栏和状态栏的需求,现分享解决办法: 开发环境 OpenHarmony 5.0.0r 代码分析 思路: launcher本身可以关闭 导航栏(实际是 公共事件,发送消息给systemUI来实控制&#x…...