c语言 memmove模拟和momcpy模拟的比较

news2024/11/17 6:47:27

1.memcpy(两者引用的头文件均是<stdlib.h>)

这个函数适用于开辟了两个空间的字符串数组,无法进行自身与自身的拷贝。eg:

char* my_memcpy(void* s1, void* s2,int count) {
	char* start = s1;
	while (count--) {
		*(char*)s1 = *(char*)s2;
		(char*)s1 += 1;
		(char*)s2 += 1;
	}
	return start;

	
}
int main() {

	char str[20] = "bcde";
	char* str1 = "abcd";
	
	char* s = my_memcpy(str, str1, 3);
	printf("%s", s);
	return 0;
}

2.memmove

这个函数则考虑了自身与自身的拷贝,实际上,内置的memcpy实际上是直接使用了memmove的代码,而没有用有缺陷的memcpy的代码,这个函数则做到了可以处理自身拷贝。接下来对具体的过程进行解析:
 

这个图展现的就是为什么memcpy无法做到memmove效果的原因,因为在拷贝的过程中已经被覆盖了。那要如何做到不覆盖呢?考虑两种情况:

(1)要接受拷贝的位置(既3的地址)在模板首地址(既1的地址)后面,可以考虑使用下面这个处理方式:

既:先由4到6(蓝色的线)一直到1到3(紫色的线)由后往前拷贝,这样就得避免覆盖;

(2)反之,则可考虑由前往后,如图:

既由4到1,5到2,6到3,7到4这样的顺序,这样也能够很好地避免覆盖问题。


于是就有了以下实现的代码:

char* my_memmove(void* s1, void* s2,int count) {
    char* start = (char*)s1;
    if ((char*)s1 < (char*)s2) {
        while (count--) {
            *(char*)s1 = *(char*)s2;
            (char*)s1 += 1;
            (char*)s2 += 1;
        }
    }
    else {
        while (--count>=0) {
            *((char*)s1 + count) = *((char*)s2 + count);
        }
    }
    return start;

    
}
int main() {

    char str[20] = "bcde";
    char* str1 = "abcd";
    
    char* s = my_memmove(str, str+1, 3);
    printf("%s", s);
    return 0;
}

打印结果如下:

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

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

相关文章

windows10使用bat脚本安装前后端环境之nginx注册服务

首先需要搞清楚nginx本地是怎么安装配置的、然后在根据如下步骤编写bat脚本&#xff1a; 思路 1.下载nginx-1.26 zip压缩包安装包 2.调整conf配置 3.借助winsw将nginx应用注册为服务&#xff0c;winsw下载地址 然后重命名nginx_service.exe 4.配置nginx-service.xml 5.注册wi…

【运维资料】系统运维管理方案(Doc原件2024)

1 编制目的 2 系统运行维护 2.1 系统运维内容 2.2 日常运行维护方案 2.2.1 日常巡检 2.2.2 状态监控 2.2.3 系统优化 2.2.4 软件系统问题处理及升级 2.2.5 系统数据库管理维护 2.2.6 灾难恢复 2.3 应急运行维护方案 2.3.1 启动应急流程 2.3.2 成立应急小组 2.3.3 应急处理过程 …

【数据结构】栈和队列(有完整的模拟实现代码!)

1、栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。…

爬取元气手机壁纸简单案例(仅用于教学,禁止任何非法获利)

爬虫常用的库 爬虫&#xff08;Web Scraping&#xff09;是一种从网页上提取数据的技术。在 Python 中&#xff0c;有许多库可以帮助实现这一目标。以下是一些常用的爬虫库&#xff0c;以及对 BeautifulSoup 的详细介绍。 常用爬虫库 1.Requests ​ a.功能&#xff1a;用于发…

利用 Llama-3.1-Nemotron-51B 推进精度-效率前沿的发展

今天&#xff0c;英伟达™&#xff08;NVIDIA&#xff09;发布了一款独特的语言模型&#xff0c;该模型具有无与伦比的准确性和效率性能。Llama 3.1-Nemotron-51B 源自 Meta 的 Llama-3.1-70B&#xff0c;它采用了一种新颖的神经架构搜索&#xff08;NAS&#xff09;方法&#…

MySQL的安装(环境为CentOS云服务器)

卸载内置环境 我们初期使用root账号&#xff0c;后期再切换成普通账号 使用 ps axj | grep mysql 查看系统中是否有MySQL相关的进程 使用 systemctl stop mysqld 关停进程 使用 rpm -qa | grep mysql 查看MySQL相关的安装包 使用 rpm -qa | grep mysql | xargs yum -y remo…

试用Debian12.7和Ubuntu24.4小札

Debian GNU/Linux 12 (bookworm)和Ubuntu 24.04.1 LTS是现阶段&#xff08;2024年9月26日&#xff09;两个发行版的最新版本。Ubuntu Server版本默认就不带桌面&#xff08;ubuntu-24.04-live-server-amd64.iso&#xff09;&#xff0c;这个默认就是最小化安装&#xff08;安装…

长芯微LPQ76930锂电池组保护芯片完全P2P替代BQ76930

LPQ76930系列芯片可作为 3-15 节串联电池组监控和保护解决方案的一部分。通过 TWI 通信&#xff0c;MCU 可以使用 LPQ76930 来执行电池管理功能1&#xff0c;例如监测&#xff08;电池电压、电池 组电流、电池组温度&#xff09;、保护&#xff08;控制充电/放电 FET&#xff0…

java中的强软弱虚

在java中对象的引用有强、软、弱、虚四种&#xff0c;这些引用级别的区别主要体现在对象的生命周期、回收时机的不同。 文章目录 准备工作1. 设置内存2. 内存检测 强引用软引用弱引用虚引用 准备工作 1. 设置内存 为方便调试&#xff0c;将内存设置为16MB 依次点击菜单栏的R…

springboot基于学习行为的学生选课成绩分析系统设计与实现

目录 功能介绍使用说明系统实现截图开发核心技术介绍&#xff1a;开发步骤编译运行核心代码部分展示开发环境需求分析详细视频演示源码获取 功能介绍 学生 课程学习行为数据录入: 学生填写每门课程的学习时长、学习态度、课后作业质量等。 课程学习行为数据修改: 学生可修改已…

基于SpringBoot+Vue的大学生公考服务平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

php 平滑重启 kill -SIGUSR2 <PID> pgrep命令查看进程号

有时候我们使用nginx 大家都知道平滑重启命令: /web/nginx/sbin/nginx -s reload 但大家对php-fpm 重启 可能就是简单暴力的kill 直接搞起了 下面介绍一个sh 文件名保存为start_php.sh 来对php-fpm 进行平滑重启 #!/bin/bash# 检查 PHP-FPM 是否运行 if ! pgrep php-…

JAVA开源项目 技术交流分享平台 计算机毕业设计

本文项目编号 T 053 &#xff0c;文末自助获取源码 \color{red}{T053&#xff0c;文末自助获取源码} T053&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

论文阅读(十一):CBAM: Convolutional Block Attention Module

文章目录 1.Introduction2.Convolutional Block Attention ModuleExperimentsConclusion 论文题目&#xff1a;CBAM: Convolutional Block Attention Module&#xff08;CBAM&#xff1a;卷积注意力机制&#xff09;   论文链接&#xff1a;点击跳转   代码链接&#xff1a…

运维,36岁,正在经历中年危机,零基础入门到精通,收藏这一篇就够了

我今年36岁&#xff0c;运维经理&#xff0c;985硕士毕业&#xff0c;目前正在经历中年危机&#xff0c;真的很焦虑&#xff0c;对未来充满担忧。不知道这样的日子还会持续多久&#xff0c;突然很想把这些年的经历记录下来&#xff0c;那就从今天开始吧。 先说一下我的中年危机…

中国科学技术大学《2020年+2021年845自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《25届中国科学技术大学845自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2020年真题 2021年真题 Part1&#xff1a;2020年2021年完整版真题 2020年真…

python实战三:使用循环while模拟用户登录

# (1)初始变量 i0 while i<3: # (2)条件判断# (3)语句块user_name input(请输入您的用户名&#xff1a;)pwd input(请输入您的密码&#xff1a;)#登陆判断 if elseif user_namewwl and pwd66666666:print(系统正在登录&#xff0c;请稍后)#需要改变循环变量&#xff0c;目…

一文读懂:监督式微调(SFT)

监督式微调 (Supervised fine-tuning)&#xff0c;也就是SFT&#xff0c;就是拿一个已经学了不少东西的大型语言模型&#xff0c;然后用一些特定的、已经标记好的数据来教它怎么更好地完成某个特定的任务。就好比你已经学会了做饭&#xff0c;但是要特别学会怎么做川菜&#xf…

以流量裂变为目标,驱动动销新潮流

在当今数字化商业世界&#xff0c;流量成为关键。而以流量裂变为目标的动销策略&#xff0c;正成为企业致胜法宝。 流量裂变&#xff0c;即让流量呈指数级增长。它依靠用户传播分享&#xff0c;能快速扩大品牌曝光度与影响力&#xff0c;提高获客效率。动销则是推动产品销售&am…

【幂简集成】手机归属地查询API,精准获取号码所在地,提升数据准确率

在互联网与移动通信技术迅猛进步的背景下&#xff0c;手机号码已成为企业经营及个人生活中的重要工具。对众多企业而言&#xff0c;通过手机号归属地查询&#xff0c;既可优化营销策略&#xff0c;又能提高客户服务精确性。手机号归属地查询 API 的问世&#xff0c;旨在满足这一…