memmove and   memcpy

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memmove and   memcpy相关的知识,希望对你有一定的参考价值。

2016年2月9日       正月初二          晴

以前上课时候老师提到过memcpy memove让大家下去自己尝试着写出代码来,后来不知如何给忘了,今天复习笔记的时候看见了这两个函数,所以花了点时间把它给搞懂。

memcpy 和memove都是c语言中的库函数,在头文件string.h中作用是拷贝一定长度内存的内容,原型分别如下:

void *my_memcpy(void *dest,void *src,size_t count)

void* my_memmove(void *dest, const void *src, size_t count)

其实它们的作用都是一样的,唯一的区别就是当内存发生局部重叠的时候memove保证拷贝的结果是正确的,memcpy 不保证拷贝结果的正确性

            「 count 」

     █████████

     ∣    〡  

     Dest   src

      「count 」

     █████████

     ∣    〡  

     src   Dest

    第一中情况下拷贝重叠区域不会出现问题,内容均可以正确拷贝。

第二种情况下,问题出现在右边的两个字节,这两个字节原来的内容就会被覆盖掉,而且没有保存,所以接下来拷贝的时候拷贝的是已经覆盖的内容,显然这是有问题的,实际上memove在拷贝两个有重叠区域的内存时可以保证拷贝的正确性,但是memcpy就不行了,但是他也有自己的优点就是运行速度快。

 

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#include <assert.h>

#include <stdlib.h> 

void* my_memmove(void *dest,  void *srcsize_t count)

/*size _t 为了增强程序的可移植性,便有了size_t ,

不同系统上,定义size_t可能不一样。

经测试发现,在32位系统中size_t是4字节的,

在64位系统中,size_t是8字节的,

这样利用该类型可以增加程序移植性。*/

{

char* p1=src;

char* p2=dest;

char* ret=NULL;

assert(dest);

assert(src);

//内存重叠时从后开始拷贝

if((p2>p1)&&(p2<p1+count))

{

 while(count--)

 {

  *(p2+count)=*(p1+count);

 }

}

//内存不重叠

else

{

while(count--)

{

   *p2++=*p1++;

}

}

return ret;

void* my_memcpy(voiddest,const void*src,size_t count)

{

char* p1=(char*)src;

char* p2=(char*)dest;

char* ret=NULL;

assert(dest);

assert(src);

while(count--)

{

*p2++=*p1++;

}

}

int main()

{

char str[]="hello world!hello bit!";

my_memmove(str + 2, str , 5);

puts(str);

system("pause");

return 0;


以上是关于memmove and   memcpy的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ memmove与memcpy的区别及实现

strcpy strcmp memmove

算法-memcopy与memmove的区别

模拟实现部分库函数(strcpy,strcmp,strcat,strstr,memcpy,memmove,memset)

memmove 和 memcpy的区别

模拟实现库函数strlen,strcpy,strstr,memmove,memcpy,strcat