memmove使⽤和模拟实现

server/2024/9/24 2:01:08/

一:memmove的使⽤

这是memmove在库里的定义,具体可在cplusplus.com查看

void * memmove ( void * destination, const void * source, size_t num )

• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。

• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

代码:

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);   int i = 0;    for (i = 0; i < 10; i++)  {        printf("%d ", arr1[i]);  }return 0; }

输出的结果:1 2 1 2 3 4 5 8 9 1

二:memmove的模拟实现

代码1:

void*my_memmove(void* dst, const void* src, size_t count)
{void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)) {while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {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);
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr+2, arr , 20);for (int i = 0; i < 10; i++){printf("%d  ", arr[i]);//1 2 1 2 3 4 5 8 9 10,结果}return 0;
}

代码2:

函数也可以这样写,结果一样

void* my_memmove(void* arr1, const void* arr2, size_t num)
{if (arr1 < arr2){while (num--){*(char*)arr1 = *(char*)arr2;arr1 = (char*)arr1 + 1;arr2 = (char*)arr2 + 1;}}if (arr1 > arr2){//	arr1 = (char*)arr1 + num - 1;//	arr2 = (char*)arr2 + num - 1;while (num--){*((char*)arr1+num-1)=*((char*)arr2+num-1);//法1 //取消注释就是另一种方法//	*(char*)arr1 = *(char*)arr2;//	arr1 = (char*)arr1 - 1;//	arr2 = (char*)arr2 - 1;}}
}


http://www.ppmy.cn/server/42883.html

相关文章

C# 中的 Dictionary<TKey, TValue> 类

Dictionary<TKey, TValue> 是 C# 中的一个泛型集合类,它提供了一种键值对的存储结构,可以用来存储和快速访问数据。它的主要特点如下: 键值对结构: Dictionary 中的每个元素都是一个键值对,键必须是唯一的,值可以重复。 快速访问: Dictionary 基于哈希表实现,可以提供 O…

Hive的小文件处理

针对ORC存储格式的小文件 --orc合并小文件的特定语法,使用concatenate(连接、使连续)关键字 --非分区表 alter table table_name concatenate;--分区表 alter table table_name partition(dtxxx) concatenate;针对TEXTFILE存储格式的小文件 --将这些小文件进行合并,这里使用d…

Python异常处理:打造你的代码防弹衣!

Hi&#xff0c;我是阿佑&#xff0c;上文咱们讲到——揭秘Python的魔法&#xff1a;装饰器的超能力大揭秘 ‍♂️✨&#xff0c;阿佑将带领大家通过精准捕获异常、使用with语句和上下文管理器、以及异常链等高级技巧来增强代码的健壮性。就像为代码穿上防弹衣&#xff0c;保护它…

dcache-android框架中的设计模式详解

引言&#xff1a;孤独的人喜欢深夜&#xff0c;多情的人喜欢黄昏。幸福的人喜欢阳光&#xff0c;伤心的人偏爱风雨。 众所周知&#xff0c;dcache-android是本人一行一行代码手写出来的Android数据缓存框架&#xff0c;写了好几年了&#xff0c;虽然不是每天写&#xff0c;但一…

java单元测试:JUnit测试框架

JUnit是Java语言中最常用的单元测试框架之一&#xff0c;用于编写和运行可重复的测试。它的主要功能是帮助开发者验证代码的正确性&#xff0c;确保代码在变更后仍然工作正常。以下是关于JUnit的详细介绍&#xff1a; 1. JUnit简介 JUnit是一个开源的单元测试框架&#xff0c…

java单元测试:使用Mockito模拟外部依赖

使用Mock对象来模拟外部依赖是单元测试中的重要技巧&#xff0c;特别是在你需要测试的代码依赖于外部系统&#xff08;如数据库、网络服务等&#xff09;时。Mock对象允许你在不实际调用这些外部系统的情况下测试代码的行为&#xff0c;从而提高测试的独立性和执行速度。 什么…

kettle从入门到精通 第六十三课 ETL之kettle kettle调用python脚本的两种方法

想真正学习或者提升自己的ETL领域知识的朋友欢迎进群&#xff0c;一起学习&#xff0c;共同进步。若二维码失效&#xff0c;公众号后台加我微信入群&#xff0c;备注kettle。 kettle中不能直接调用python脚本&#xff0c;可以通过shell脚本和http进行调用pyton服务。 一、shel…

CMake 在工程管理中的使用 Window/MacOS

CMake 在工程管理中的使用 Window/MacOS 是什么 CMake 是一个跨平台的编译工具&#xff0c;可以用简单的语句来描述所有平台的编译过程。 编译工具 Visual Studio 自动解析编译 cmakelists.txt 编译与链接 编译&#xff1a;将当前的C/C 代码通过编译器&#xff0c;编译位…