天天看点

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 *src, size_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(void* dest,const void*src,size_t count)

char* p1=(char*)src;

char* p2=(char*)dest;

*p2++=*p1++;

int main()

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

my_memmove(str + 2, str , 5);

puts(str);

system("pause");

继续阅读