关于memcpy和memmove的一点重要说明

今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是

实现同样的功能,没有接触到其不同。

memcpy和memmove在MSDN的定义如下:

从两者的声明来看的确没有区别,我们来看这样一个例子

当我们需要将char* src="abcde"这个字符串全部copy到dest中然而src与dest在内存中大概是这样存在的:

内存地址   低------>高

src   dest
1  2  3  4  5   6
[ a ][ b ][ c ][ d ][ e ][ '\0' ][ ][ ][ ][ ][ ][ ][ ]

src地址为内存1,目的地址为内存2此时很明显内存出现了重叠,当我们拷贝字符a到第三个内存位置的时

a将覆盖src内存中的第三个字符 这种情况在memcpy未定义然而memmove却给出了正确的处理方式

解决方法,试想当我们先将dest地址移动dest+n-1同时src地址移动src+n-1这样再从src的最后一个元素开

始逐个向前拷贝到dest中就完美的避免了内存重叠导致的元素覆盖问题呢

下面我们根据memcpy和memmove给出自己的实现:

#include <iostream>
using namespace std;

void *memcopy( void *dest, const void *src, size_t count )
{
  if(dest==NULL||src==NULL)
    return NULL;
  char* Dest=(char*)dest;
  const char* Src=(char*)src;

  int i=0;

  while(i<count)
  {
    *Dest++=*Src++;
    i++;
  }

  return dest;
}

void *memmove(void *dest,const void *src,size_t count )
{
  if(dest==NULL||src==NULL)
    return NULL;

  char* Dest=(char*)dest;
  const char* Src=(char*)src;

  int i=0;
  if(src>dest)
  {
    while(i<count)//正向拷贝
    {
      *Dest++=*Src++;
      i++;
    }
  }
  else
  {
    Dest=Dest+count-1;//反向拷贝
    Src=Src+count-1;

    while(i<count)
    {
      *Dest--=*Src--;
      i--;
    }
  }

  return dest;
}

void main()
{
  char dest[80];
  memset(dest,'\0',80);
  char* src="memcpyteststring";
  int n;
  cout<<"How many char you want to copy from src to dest(memcpy): ";
  cin>>n;
  cout<<"The dest string is: "<<(char*)memcopy(dest,src,n)<<endl;
  cout<<"How many char you want to copy from src to dest(memcpy): ";
  cin>>n;
  cout<<"The dest string is: "<<(char*)memmove(dest,src,n)<<endl;
  return;
}

运行截图:

以上就是小编为大家带来的关于memcpy和memmove的一点重要说明全部内容了,希望大家多多支持我们~

(0)

相关推荐

  • C++中memcpy和memmove的区别总结

    变态的命名 我们在写程序时,一般讲究见到变量的命名,就能让别人基本知道该变量的含义.memcpy内存拷贝,没有问题;memmove,内存移动?错,如果这样理解的话,那么这篇文章你就必须要好好看看了,memmove还是内存拷贝.那么既然memcpy和memmove二者都是内存拷贝,那二者究竟有什么区别呢? 先说memcpy 你有没有好好的参加过一场C++笔试.让你写出memcpy的实现,这是多么常见的笔试题啊.现在,拿起你的演算纸和笔;是的,是笔和纸,不是让你在你的IDE上写.写不出来?看下面吧:

  • 深入理解memmove()与memcpy()的区别以及实现方法

    代码如下所示: 复制代码 代码如下: // MemMove.cpp : 定义控制台应用程序的入口点.//#include "stdafx.h"#include <iostream>using namespace std; 复制代码 代码如下: void* memmove(void* dest, const void* src, size_t n){ if (n <= 0) {  cout << "Invalid count number.&quo

  • 关于memcpy和memmove的一点重要说明

    今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同. memcpy和memmove在MSDN的定义如下: 从两者的声明来看的确没有区别,我们来看这样一个例子 当我们需要将char* src="abcde"这个字符串全部copy到dest中然而src与dest在内存中大概是这样存在的: 内存地址   低------>高 src dest 1 2 3 4 5 6 [ a ][ b ][ c ][

  • C语言 模拟实现memcpy与memmove函数详解

    目录 一.memcpy函数的介绍 1.函数的声明 2.函数功能与注意事项 3.函数的使用 二.模拟实现memcpy函数 1.模拟分析 2.模拟实现 三.memmove函数的介绍 1.函数的声明 2.为什么会有memmove函数 3.函数功能与注意事项 4.函数的使用 四.模拟实现memmove函数 1.模拟分析 2.模拟实现 一.memcpy函数的介绍 1.函数的声明 void * memcpy ( void * destination, const void * source, size_t

  • Cython处理C字符串的示例详解

    目录 楔子 创建 C 字符串 引用计数陷阱 strlen strcpy strcat strcmp sprintf 动态申请字符串内存 memset memcpy memmove memcmp 小结 楔子 在介绍数据类型的时候我们说过,Python 的数据类型相比 C 来说要更加的通用,但速度却远不及 C.如果你在使用 Cython 加速 Python 时遇到了瓶颈,但还希望更进一步,那么可以考虑将数据的类型替换成 C 的类型,特别是那些频繁出现的数据,比如整数.浮点数.字符串. 由于整数和浮点

  • 详解C语言中的memset()函数

    C语言memset()函数:将内存的前n个字节设置为特定的值 头文件: #include <string.h> memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int value, size_t num ); 参数说明: ptr 为要操作的内存的指针. value 为要设置的值.你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换.

  • 关于《C和指针》的学习笔记

    有了之前的基础,此文只是把一些以前没有注意到的和值得学习的知识做一个记录. 第一章 作者认为使用#if 0 .... #endif比用/*和*/好,因为后者不能嵌套.但是对于//并没有说明. 第二章 三字母词,用两个问号加一个符号表示另一个符号,比较类似于转义字符.查阅了一些资料,它的使用与编译器有关,了解即可,防止字符串常量被错误的解释. 复制代码 代码如下: ??( ==> [ ??< ==> { ??= ==> # ??) ==> ] ??> ==> } ?

  • 温故C语言内存管理

    1. 内存管理简介 在计算机系统,特别是嵌入式系统中,内存资源是非常 有限的.尤其对于移动端开发者来说,硬件资源的限制使得其在程序设计中首要考虑的问题就是如何 有效地管理内存资源. 常见内存使用错误: 内存申请未成功,就进行使用 内存申请成功,但没有初始化 内存初始化成功,但越界访问 忘记释放内存或者释放一部分 内存管理不当的危害? 没有初始化,会造成内存出错 越界访问内存可能导致崩溃 忘记释放内存造成内存泄露 C语言的内存管理: C语言为用户提供了相应内存管理的AP接口,如 malloc(),

  • 一篇文章带你入门C语言:函数

    目录 函数 定义 库函数 定义 介绍 Example 1 strcpy Example 2 memset 自定义函数 Example 1 Example 2 两数交换 链式访问 Example 1 函数声明 函数递归 Example 1 Example 2 函数迭代 Example 3 Example 4 总结 函数 定义 程序里的函数又被叫做子程序,他作为一个大型程序的部分代码,有一或多个语句项组成.函数负责完成某项特定任务,提供了对过程的封装和对细节的隐藏,这样的代码通常会被集成为软件库.

  • C语言字符函数与字符串函数详解

    目录 本章重点 前言 1.strlen函数 注意点1 注意点2 2.strcpy 注意点1: 注意点2: 注意点3: 注意点4: 总结 本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 1.求字符串长度 strlen 2.长度不受限制的字符串函数 strcpy ,strcat, strcmp 3.长度受限制的字符串函数 strncpy,strncat ,strncmp 4.字符串查找 strstr,strtok 5.错误信息报告 strerror 6.字符操作 7.内存操作函数 mem

  • C语言内存函数的使用及其模拟实现

    目录 前言 memcpy memcmp memmove memset 总结 前言 在C语言中,我们除了会经常用到与字符相关的函数,我们还会使用到与内存相关的库函数.今天我们就来学习几个常见的内存函数吧! memcpy void * memcpy ( void * destination, const void * source, size_t num ); 这是一个内存复制函数,该函数会从source的位置开始向后复制num个字节的数据到destination的内存位置. 这个函数在遇到 '\0

随机推荐