【C语言内存函数】
目录
1.memcpy
使用
模拟实现
2.memmove
使用
模拟实现
3.memset
使用
4.memcmp
使用
1.memcpy
使用
void * memcpy ( void * destination, const void * source, size_t num );目的地址 源地址 字节数
destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。
source:指向要复制的数据源的指针,类型转换为const void*类型的指针。
num:要复制的字节数。size_t是一个无符号整数类型。
1.函数memcpy从源地址(destimation)的位置开始向后复制num个字节的数据到目的地址(source)指向的内存位置
2.这个函数在遇到 '\0' 的时候并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未定义的。
演示:
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);//从arr1->arr2 20个字节int i = 0;
//这里打印10个方便查看for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}
结果:

模拟实现
void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest);//判断是否为空assert(src);void* ret = dest;//防止返回的地址变动
//逐个传入while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return(ret);
}
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };my_memcpy(arr2, arr1, 20);//从arr1->arr2 20个字节int i = 0;
//这里打印10个方便查看for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}
结果:

2.memmove
使用
其实跟memcpy差不多
void * memmove ( void * destination, const void * source, size_t num );目的地址 源地址 字节数
destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。
source:指向要复制的数据源的指针,类型转换为constvoid*类型的指针。
num:要复制的字节数。size t是一个无符号整数类型。
1.将num字节的值从源地址指向的位置复制到目的地址指向的内存块。
2.复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。
3.当源地址看见和目标地址出现重叠,可以使用memmove
演示一下,如何重叠的
将源地址的数据传入源地址内(实现在同一个看见重叠)
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//将源地址数据传入(源地址+2) 发生重叠memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}
这里传入的20个字节 从(arr+2)开始 后面20个字节进行重叠

模拟实现
void* my_memmove(void* dest, const void* src, size_t count)
{assert(src);//判断是否为空void* ret = dest;//防止返回的地址变动
//这里进行判断位置 从哪里开始进行替换if (dest <= src || (char*)dest >= ((char*)src + count)) {while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else {dest = (char*)dest + count - 1;src = (char*)src + count - 1;while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest - 1;src = (char*)src - 1;}}return(ret);
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}
结果:

3.memset
使用
void * memset ( void * ptr, int value, size_t num );源地址 要变的内容 字节数
ptr指针,指向要填充的内存块。
value:进行设置。该值以int形式传递,但函数使用该值的无符号字符转换填充内存块。
num:要设置为值的字节数。size_t是一个无符号整数类型。
1.设置内存,将内存中的值以字节为单位设置成想要的内容。
这里就不模拟了(循环替换)
int main()
{char str[] = "hello qingtian";memset(str, 'x', 5);printf(str);return 0;
}
结果:

4.memcmp
使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );地址1 地址2 字节数
ptr1:内存块的指针。
ptr2:内存块的指针。
num:要比较的字节数。
1.进行比较ptr1和ptr2 从0开始比较num个
int main()
{char arr1[] = "abcdef";char arr2[] = "abdd";int n;n = memcmp(arr1, arr2, sizeof(arr2));if (n > 0)printf("'%s' 大于 '%s'\n", arr1, arr2);else if (n < 0)printf("'%s' 小于 '%s'\n", arr1, arr2);elseprintf("'%s' 等于 '%s'\n", arr1, arr2);return 0;
}

相关文章:
【C语言内存函数】
目录 1.memcpy 使用 模拟实现 2.memmove 使用 模拟实现 3.memset 使用 4.memcmp 使用 1.memcpy 使用 void * memcpy ( void * destination, const void * source, size_t num );目的地址 源地址 字节数 destination:指向要复制内…...
Mysql部署MHA高可用
部署前准备: mysql-8.0.27下载地址:https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.27-1.el7.x86_64.rpm-bundle.tar mha-manager下载地址:https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-mana…...
【算法学习】射线法判断点在多边形内外(C#)以及确定内外两点连线与边界的交点
1.前言: 在GIS开发中,经常会遇到确定一个坐标点是否在一块区域的内部这一问题。 如果这个问题不是一个单纯的数学问题,例如:在判断DEM、二维图像像素点、3D点云点等含有自身特征信息的这些点是否在一个区域范围内部的时候&#x…...
SQL语句(DML)
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改等操作 DML-添加数据 insert into employee(id, workno, name, gender, age, idcard) values (1,1,Itcast,男,10,123456789012345678);select *…...
uniapp小程序打开地图导航
uniapp uni.getLocation({type: gcj02, //返回可以用于uni.openLocation的经纬度success: function (res) {const latitude res.latitude;const longitude res.longitude;uni.openLocation({latitude: latitude,longitude: longitude,success: function () {console.log(suc…...
webstorm格式化或保存时 vue3引入的组件被删除了
解决办法 保存时设置 格式化设置...
Java时间转换
一、线程不安全 Date date new Date(); SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String prefix dateFormat.format(date);二、线程安全,建议使用 String t1 LocalDateTime.now().format(DateTimeFormatter.ofPattern("y…...
Spring Boot与WebFlux的实战案例
Spring Boot与WebFlux的实战案例 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨如何利用Spring Boot和WebFlux构建响应式应用的实战…...
vue3引入本地静态资源图片
一、单张图片引入 import imgXX from /assets/images/xx.png二、多张图片引入 说明:import.meta.url 是一个 ESM 的原生功能,会暴露当前模块的 URL。将它与原生的 URL 构造器 组合使用 注意:填写自己项目图片存放的路径 /** vite的特殊性…...
git 禁止dev合并到任何其他分支
创建 pre-merge-commit 钩子 导航到 Git 仓库的钩子目录: cd /path/to/your/repo/.git/hooks创建或编辑 pre-merge-commit 钩子: 也可以通过指令创建 nano pre-merge-commit在钩子文件中添加以下代码: #!/bin/sh# 获取当前分支名称 curr…...
第二节:如何使用thymeleaf渲染html(自学Spring boot 3.x的第一天)
大家好,我是网创有方,今天来学习如何使用thymeleaf渲染html。该模板运用不广泛,所以本节内容了解既可。 第一步:创建html文件。 在模板templates目录下创建一个html文件。 编写代码如下: <!DOCTYPE html> <…...
计算机相关术语科普之什么叫网关(Gateway)
网关(Gateway)是一个在计算机网络中起到关键作用的设备或系统,它扮演着网络间连接器或协议转换器的角色。 一、定义与功能 1)定义: 网关是在不同网络之间实现互连的复杂设备,仅用于两个高层协议不同的网…...
B站网页部分API
https://www.bilibili.com/ 数据结构 mid: 用户id name: 用户名 face: 用户头像url noface.jpg为默认头像 sign: 签名level: b站等级 coins: b站硬币粉丝 https://api.bilibili.com/x/relation/fans?vmid{mid}&pn{pn}&ps{limit}&orderdesc&…...
使用Spring Boot和Spring Security保护你的应用
使用Spring Boot和Spring Security保护你的应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何利用Spring Boot和Spring Security来保护…...
CVE-2019-12272 Openwrt可视页面LuCi命令注入漏洞复现(完结)
声明 本文所使用的一些源代码等内容已经上传至github,具体地址如下 Vulnerability_POC-EXP/OpenWrt/CVE-2019-12272 at main a2148001284/Vulnerability_POC-EXP GitHub 漏洞简介 参考内容: CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析 |…...
【多线程开发 4】从源码学习LockSupport
从源码学习LockSupport 2024年6月30日 大家好啊,好久没写博客了,今天打算写一下,讲一下JUC里面LockSupport这个类。 这个是一个工具类,实际上也是为了线程通信开发的。它的源码比较短,也只引用了Unsafe一个类。所以…...
gameui C++的代码
gameui C的代码 #include <graphics.h> #include "gameboard.h" const int WIDTH 560; const int HEIGHT 780; const int GRID_SIZE 120; class GameUi { private: public:GameUi(GameBoard& gb) {// 初始化图形窗口initgraph(WIDTH, HEIGHT);// 设置…...
1.什么是js?特点是什么?组成部分?
Js是一种直译式脚本语言,一种动态类型,弱类型,基于原型的高级语言。 直译式:js程序运行过程中直接编译成机器语言。 脚本语言:在程序运行过程中逐行进行解释说明,不需要预编译。 动态类型:js…...
爬虫是什么?
目录 1.什么是互联网爬虫? 2.爬虫核心? 3.爬虫的用途? 4.爬虫分类? 5.反爬手段? 1.什么是互联网爬虫? 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序…...
深入理解Presto分页查询:方法与最佳实践
目录 引言为什么需要分页查询Presto简介分页查询的基本概念Presto分页查询的实现方法 使用LIMIT和OFFSET使用游标分页结合外部工具和框架 分页查询的性能优化 索引优化查询计划优化数据分区 实际案例分析最佳实践与常见问题 大数据集分页复杂查询分页实时性要求高的场景 总结 …...
排序算法---(四)
引言在前几篇文章里面讲到了六种排序,今天来讲一下剩下两种:基数排序、堆排序基数排序1.思路(1)首先确定最大数的位数:找到待排序数组中的最大数,并确定其位数(2)将元素按照相应的位…...
利用M2LOrder实现安全高效的内网穿透方案设计与验证
利用M2LOrder实现安全高效的内网穿透方案设计与验证 1. 引言 你有没有遇到过这样的麻烦事?自己电脑上开发了一个网站或者服务,想给同事或者客户临时看一下效果,结果发现对方根本访问不了。原因很简单,你的服务跑在公司的内网或者…...
Android Hook应用开发实战:从入门到精通LSPosed框架
Android Hook应用开发实战:从入门到精通LSPosed框架 【免费下载链接】LSPosed_mod My changes to LSPosed 项目地址: https://gitcode.com/GitHub_Trending/ls/LSPosed_mod 一、技术背景:为什么需要Android钩子技术 理解钩子技术的核心价值 钩子…...
KMS_VL_ALL_AIO:智能激活脚本的高效办公解决方案
KMS_VL_ALL_AIO:智能激活脚本的高效办公解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在数字化办公环境中,Windows系统和Office办公套件的激活管理常常成为用户…...
手把手教你搭建mPLUG图片问答工具:全本地运行,无需联网
手把手教你搭建mPLUG图片问答工具:全本地运行,无需联网 1. 项目介绍与核心价值 想象一下,你有一张照片但不确定里面有什么,或者需要快速了解图片中的细节信息。传统方法可能需要你手动描述、上网搜索,或者将图片上传…...
Glyph镜像实测分享:低质量图片文字识别,效果出乎意料
Glyph镜像实测分享:低质量图片文字识别,效果出乎意料 1. 引言:低质量图片文字识别的挑战 在日常工作和生活中,我们经常会遇到需要从低质量图片中提取文字的场景。无论是模糊的扫描件、低分辨率的截图,还是光线不佳的…...
从零封装Vue版JSMpeg播放器:支持截图/录制/旋转的直播流组件开发指南
从零封装Vue版JSMpeg播放器:支持截图/录制/旋转的直播流组件开发指南 1. 技术选型与架构设计 在Web端实现低延迟视频直播需要解决三个核心问题:编解码效率、传输协议选择和渲染性能。基于JSMpeg的方案优势在于: 超低延迟(可达50ms…...
乙巳马年·皇城大门春联生成终端W与低代码平台集成:在Dify中快速创建AI应用
乙巳马年皇城大门春联生成终端W与低代码平台集成:在Dify中快速创建AI应用 又到了岁末年初,很多朋友、商家甚至社区都在为准备春联发愁。传统方式要么自己写,要么找人设计,费时费力不说,风格还未必满意。现在ÿ…...
Swift-All快速上手:小白也能轻松搞定大模型训练与部署
Swift-All快速上手:小白也能轻松搞定大模型训练与部署 1. 为什么选择Swift-All? 如果你刚接触大模型训练,可能会被各种复杂的工具和框架吓到。配置环境、处理分布式训练、管理显存...这些技术细节常常让新手望而却步。这就是Swift-All的价值…...
Swin2SR模型可解释性:理解超分决策过程
Swin2SR模型可解释性:理解超分决策过程 1. 引言 当我们使用Swin2SR这样的超分辨率模型时,经常会惊叹于它能够将模糊的低分辨率图像转换为清晰的高分辨率图像。但你是否好奇过,这个"AI显微镜"是如何做出这些决策的?它是…...
