码迷,mamicode.com
首页 > 其他好文 > 详细

memmove and   memcpy

时间:2016-02-27 01:08:03      阅读:202      评论:0      收藏:0      [点我收藏+]

标签: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

标签:memmove and memcpy

原文地址:http://10808695.blog.51cto.com/10798695/1745413

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!