【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;
}

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

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

相关文章

20240703 每日AI必读资讯

&#x1f916;爆火Character AI惨遭阉割 美国00后集体“失恋” - Character AI曾是00后最火爆的社交软件&#xff0c;但用户发现对话模型变得冷淡&#xff0c;失去趣味。 - 用户流失严重&#xff0c;面临成本高、竞争激烈的挑战&#xff0c;甚至遭到挖角。 - 尽管困难重重&a…

最小步数模型——AcWing 1107. 魔板

最小步数模型 定义 最小步数模型通常是指在某种约束条件下&#xff0c;寻找从初始状态到目标状态所需的最少操作或移动次数的问题。这类问题广泛存在于算法、图论、动态规划、组合优化等领域。具体来说&#xff0c;它涉及确定一个序列或路径&#xff0c;使得按照特定规则执行…

jenkins在使用pipeline时,为何没有方块形视图

项目场景&#xff1a; 安装完Jenkins时后&#xff0c;通过pipeline创建的项目任务。 问题描述 在立即构建后&#xff0c;没有显示每个阶段的视图。 原因分析&#xff1a; 原因是&#xff0c;刚安装的Jenkins&#xff0c;这个视图不是Jenkins自带的功能&#xff0c;而必须安装…

EDA 虚拟机 Synopsys Sentaurus TCAD 2017.09 下载

下载地址&#xff08;制作不易&#xff0c;下载使用需付费&#xff0c;不能接受的请勿下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1327I58gvV1usWSqSrG7KXw?pwdo03i 提取码&#xff1a;o03i

Boss直聘,无良厂商,乱封号

耽误招工作&#xff0c;瞎吉儿封号 哥们单身 需要女生多的公司 问一下都不行&#xff0c;什么尿性 直接就给你封了 装什么呢 辣鸡boss 倒闭吧赶紧 我是狗子&#xff0c;希望你倒闭&#xff01;

Radxa 学习摘录

文章目录 1、参考资料2、硬件知识CIF 和 ISP 3、shell4、交叉编译工具链5、问题6、DTS7、驱动 1、参考资料 技术论坛&#xff08;推荐&#xff09; 官方资料下载 wiki资料 u-boot 文档 u-boot 源码 内核文档 内核源码 原理图 radxa-repo radxa-build radxa-pkg radxa-doc…

寻找最适合你的交易风格

与Eagle Trader一起&#xff0c;您将拥有一位坚不可摧的合作伙伴&#xff0c;为您的交易之路增添坚实信心&#xff0c;并重塑交易体验的每一个细节。我们量身定制的交易环境&#xff0c;更能让您精准捕捉并驾驭符合您独特交易风格的卓越条件&#xff0c;让交易之旅更加自由畅快…

Python容器 之 字典--定义

1.字典的介绍 1, 字典 dict, 使用 {} 表示 2, 字典是由键(key)值(value)对组成的, key: value 3, 一个键值对是一组数据, 多个键值对之间使用 逗号隔开 4, 在一个字典中, 字典的键 是不能重复的&#xff0c;如果重复原数据会被覆盖 5, 字典中的键 主要使用 字符串类型, 可以是…

Mac可以卸载掉系统自带的软件吗 Mac第三方软件无法卸载是为什么

在使用Mac电脑时&#xff0c;有时候我们会发现系统预装的一些应用并不常用或者不符合个人需求&#xff0c;想要将它们卸载掉。然而&#xff0c;对于系统自带的软件&#xff0c;卸载并不简单&#xff0c;需要谨慎对待以免影响系统稳定性和功能正常运行。下面我们来看看Mac可以卸…

Firefox 编译指南2024 Windows10-使用Git 管理您的Firefox(五)

1. 引言 在现代软件开发中&#xff0c;版本控制系统&#xff08;VCS&#xff09;是不可或缺的工具&#xff0c;它不仅帮助开发者有效管理代码的变化&#xff0c;还支持团队协作与项目管理。Mercurial 是一个高效且易用的分布式版本控制系统&#xff0c;其设计目标是简洁、快速…

【antd + vue】表格行合并,同时使用插槽

一、需求说明 表格中&#xff0c;如果一个学校有多个考试科目&#xff0c;则分行展示&#xff0c;其余列&#xff0c;则合并为一行展示&#xff0c;如图所示 二、需求分析 1、表格行合并 相当于有4行&#xff0c;其中1、2行是同一个学校包含不同考试科目及对应人次的数据&am…

手机数据恢复篇:如何在恢复出厂设置后的 iPhone 恢复短信

您可能会认为&#xff0c;在恢复出厂设置iPhone后恢复短信时&#xff0c;一切都会丢失&#xff0c;但是仍然有一些方法可以检索您的重要对话。截至 2024 年&#xff0c;数据恢复技术的进步使得从备份甚至直接从设备内存中抢救消息变得更加容易。无论是通过 iCloud、iTunes 还是…

LeetCode Hard|124.二叉树中的最大路径和

力扣题目链接 题目解读&#xff1a; 二叉树路径的定义即从1.任意节点出发&#xff0c;到达任意节点&#xff1b;2.该路径至少包含一个节点&#xff0c;且不一定经过跟节点&#xff1b;3.求所有可能路径和的最大值。 也就是说路径途径一个节点只能选择来去两个方向 考虑一个二叉…

2025年U.S.News世界大学排名前200榜单

近日&#xff0c;U.S. News公布了2025全球最佳院校排名&#xff0c;作为公认的四大世界高校排行榜&#xff0c;该排名主要围绕着学术声誉、学术成果等&#xff0c;因此备受访问学者、联合培养博士生及博士后申请者们青睐&#xff0c;知识人网小编特作介绍并发布排名前200的榜单…

我与C++的爱恋:list的使用

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 一、list介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2.list的底层是双向链表结构&#xff0c;双向链表中…

西电811考研、140分专业课及811/821经验

被拟录取了&#xff0c;说一说自己考研经验&#xff0c;本人跟的研梦考研全程班&#xff0c;胖覃学长很负责任&#xff0c;貌似已经直博西电了&#xff0c;但也很负责。 1、通信工程学院分为学硕与专硕&#xff0c;学硕包含信息与通信工程、交通运输工程、军队指挥学&#xff…

Linux环境安装配置nginx服务流程

Linux环境的Centos、麒麟、统信操作系统安装配置nginx服务流程操作&#xff1a; 1、官网下载 下载地址 或者通过命令下载 wget http://nginx.org/download/nginx-1.20.2.tar.gz 2、上传到指定的服务器并解压 tar -zxvf nginx-1.20.1.tar.gzcd nginx-1.20.1 3、编译并安装到…

数字化供应链:背景特点

​背景 1、外部环境 近年来&#xff0c;供应链脆弱性凸显&#xff0c;企业供应链压力难以缓解。 美国媒体针对美国零售联合会、美国服装和鞋类协会、美国供应链管理专业委员会等主体进行的一项供应链调查显示&#xff1a; 61%的供应链经理预计&#xff0c;供应链紊乱问题至少…

C++(第一天-----命名空间和引用)

一、C/C的区别 1、与C相比   c语言面向过程&#xff0c;c面向对象。   c能够对函数进行重载&#xff0c;可使同名的函数功能变得更加强大。   c引入了名字空间&#xff0c;可以使定义的变量名更多。   c可以使用引用传参&#xff0c;引用传参比起指针传参更加快&#…

企业化运维(5)_mysql数据库

###1.源码编译mysql### 对压缩包进行解压&#xff0c;并对mysql进行源码编译&#xff0c;其中需要下载依赖才能编译成功。 官网&#xff1a; www.mysql.com解压并进入目录 [rootserver1 ~]# tar xf mysql-boost-5.7.40.tar.gz [rootserver1 ~]# cd mysql-5.7.40/安装依赖性…