模拟实现memcpy()memcmp()memmove()

2023-11-16

核心

  • memcpy() :
    • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
    • 这个函数在遇到 ‘\0’ 的时候并不会停下来。
    • 如果source和destination有任何的重叠,复制的结果都是未定义的
  • memcmp() :
    • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
    • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
  • memmove() : 比较从ptr1和ptr2指针开始的num个字节

实现

  • memcpy()
void* MyMemcpy(void* dest, const void* src, int num){
	assert(dest && src);
	void* p = dest;
	while (num){
		*(char*)dest = *(char*)src;
		src = (char*)src + 1;
		dest = (char*)dest + 1;
		num--;
	}
	return p;
}
int main () {
	char str1[100] = "asdaa";
	char str2[100] = "asdaaaaaa";
	int num = 10;
	MyMemcpy(str1, str2, num);
	return 0;
}
  • memcmp()
int MyMemcmp(const void* str1, const void* str2, int num){
	assert(str1 && str2);
	//结束while循环的条件是 num == 0;或者,都为'\0'
	while (num && (*(char*)str1 != '\0' || *(char*)str2 != '\0')){
		if (*(char*)str1 - *(char*)str2 > 0){
			return 1;
		}
		else if (*(char*)str1 - *(char*)str2 < 0){
			return -1;
		}
		str1 = (char*)str1 + 1;
		str2 = (char*)str2 + 1;
 		num--;
	}
	return 0;
}
int main () {
	char str1[] = "asdaa";
	char str2[] = "asda";
	int num = 10;
	int ret = MyMemcmp(str1, str2, num);
	return 0;
}
  • memmove()
void* MyMemmove(void* dest, const void* src, int num){
	assert(dest && src);
	void* p = dest;
	if(dest <= src){
		char* p1 = (char*)dest;
		char* p2 = (char*)src;
		for(int i = 0; i < num; i++){
			*p1 = *p2;
			p1++;
			p2++;
		}
		
	}
	else if (dest > src){
		char* p1 = (char*)dest + num - 1;
		char* p2 = (char*)src + num - 1;
		for (int i = 0; i < num; i++){
			*p1 = *p2;
			p1--;
			p2--;
		}
	}
	return p;
}
int main () {
	char str1[100] = "asdaa";
	char str2[100] = "asdaedc";
	int num = 10;
	MyMemmove(str2 + 1, str2, num);
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟实现memcpy()memcmp()memmove() 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 基于MATLAB的车牌识别

    目录 车牌识别系统的介绍与展示 车牌定位 1 灰度处理 2 边缘检测 车牌分割 1 图像腐蚀 2 图像平滑 3 移除对象 4 图像切割 车牌识别 1 灰度处理 2 直方图均衡化 3 二值化 4 中值滤波 5 字符识别 车牌识别系统的介绍与展
  • 如何启动单节点zookeeper以及注意事项

    1 安装jdk 因为zookeeper是基于java进行开发的 2 将zookeeper解压之后 再zookeeper目录下conf目录下有一个zoo sample cfg 将它改名成zoo cfg 因为zookeeper启动时自动加载的是
  • QT获取各种平台系统版本信息之QSysInfo

    一 头文件 include
  • 小程序授权第三方平台

  • 数据分析初步认识

    今天的任务是阅读数据分析的概述 老师的建议是带着问题去学习 今天的任务结束之后 我要能回答为什么学习数据分析 所以 为了更好地记录我今天的学习 我决定边学边写博客 那么 开始吧 一 数据分析的含义 作用和分类 数据分析就是一个基于一定目的
  • vue运用animate.css设置transition动画

    vue的transition动画 关于vue中animation动画问题 找到要用动画的元素 我是想要实现切换页面的动画效果 所以找到app vue中的router view 用transition将它包裹起来 用动画库animate cs
  • PCB Layout经验

    1 旁路电容尽量靠近IC脚 这样对整个电路的抗干扰能力有很大的帮助 2 布局的时候 可以把零件尽量对齐 可以增加板子美观 3 多层板的顶层IC底部 最好铺一下铜 有助于IC散热以及抗干扰 4 贴片IC的管脚不要做的太长 防止IC在SMT贴片
  • 移动端使用fastclick解决click延迟300毫秒

    做移动端商城使用click会出现大约300毫秒的延迟 为了能够立即响应用户的点击事件 会用到FastClick 一 安装 npm i fastclick save 二 使用 在main js中引入 import FastClick from
  • reGeorg的工具原理

    首先先创建一个socket去运行 去连接想要连接的端口 reGeorgSocksProxy客户端与服务端的通讯是基于session来区分的 并不支持在指定的session下进行 socket set nonblock 设置socket为非阻
  • 碳中和数据合集(含上市公司碳排放、碳减排、排污费、环境税等数据)1990-2022年

    数据简介 推动企业形成绿色生产方式和生活方式 支持有条件的地方和重点行业 重点企业率先达到碳排放峰值 可见 企业已成为应对气候变化 推动低碳转型 助力 双碳 目标实现的主力军 推动其绿色 低碳化转型已成为未来经济发展的必然趋势 此背景下 作
  • linux环境下运行flex,什么是flex?

    昨天装一个软件的时候 configure后遇到下面的问题 错误代码见最后 网上查到有什么 FLEX 2 01 全套下载 客户端 Flex Builder 2 with Charting 集成 Flex Builder 2 Flex 2 SD
  • LeetCode 232. 用栈实现队列

    题目链接 https leetcode cn problems implement queue using stacks 栈的特点是先进后出 而队列的特点是先进先出 我们用两个栈正好能把顺序反过来实现类似队列的操作 stackData 作为
  • navicat连接linux虚拟机上的mysql出现10060的错误解决

    https www cnblogs com mmzs p 9201558 html 我的是当时配置MySQL的时候在iptables文件里面添加了3306但是 我没有保存 所以没有监听到这个端口 弄了一中午 唉 最终通过上面的文章得以解决
  • numpy_diag函数

    diag的函数原型如下 numpy diag v k 0 如果v是一维数组 则函数返回以v为对角线的对角矩阵 如果v是二维数组 则函数返回v的对角线 import numpy as np a np arange 9 reshape 3 3
  • 如何进行技术选型

    在重大产品决策或者大规模应用开发前一般需要进行技术选型 特别是需要开发一个之前没有了解过的系统或者应用时 其目的是为了降低产品研发的技术风险 所以首先需要明确为什么需要技术选型 需要达到什么目的 整个过程需要有一套的组织流程来保证 一般可以
  • SpringBoot实现原理

    一 什么是SpringBoot SpringBoot是一个快速开发框架 快速的将一些常用的第三方依赖整合 原理 通过Maven子父工程的方式 简化XML配置 全部采用注解形式 内置Http服务器 Jetty和Tomcat 最终以java应用
  • 深入Redis命令的执行过程

    深入Redis命令的执行过程 Redis 服务器 Redis 服务器实现与多个客户端的连接 并处理这些客户端发送过来的请求 同时保存客户端执行命令所产生的数据到数据库中 Redis 服务器依靠资源管理器来维持自身的运转 其主要作用是管理 R
  • charles抓取https请求_Charles抓包

    欢迎关注公众号 学习资料不会少 Windows端设置抓取https请求 安装证书 打开Charles 选择 Help SSL Proxying Install Charles Root Certificate 信任证书 弹出安装证书对话框
  • springboot中logback日志配置

    springboot中logback日志配置 前言 默认配置 logback spring xml详细配置 前言 Spring Boot使用Apache的Commons Logging作为内部的日志框架 其仅仅是一个日志接口 在实际应用中需
  • 模拟实现memcpy()memcmp()memmove()

    核心 memcpy 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置 这个函数在遇到 0 的时候并不会停下来 如果source和destination有任何的重叠 复制的结果都是未定义的