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;

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;

}

时间: 2024-10-05 14:56:53

memmove and   memcpy的相关文章

C/C++ memmove 和 memcpy

这两个函数用于拷贝字符串或者一段连续的内存,函数原型: void * memcpy ( void * destination, const void * source, size_t num ); void * memmove ( void * destination, const void * source, size_t num ); 这里有一点需要注意:num指的是需要拷贝的字节数,所以在将void*转型成实际的类型的时候一定要考虑重新计算拷贝的单元数 比如,转成WORD型,则实际需要拷贝

[转]memmove、memcpy和memccpy

原文地址:http://www.cppblog.com/kang/archive/2009/04/05/78984.html 在原文基础上进行了一些小修改~ memmove.memcpy和memccpy三个函数都是内存的拷贝,从一个缓冲区拷贝到另一个缓冲区. memmove(void *dest,void*src,int count) memcpy(void *dest,void *src,int count) memccpy(void*dest,void*src,int ch,int coun

memmove和memcpy

1.memmove 函数原型:void *memmove(void *dest, const void *source, size_t count) 返回值说明:返回指向dest的void *指针 参数说明:dest,source分别为目标串和源串的首地址.count为要移动的字符的个数 函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中. 2.memcpy 函数原型:v

memmove和memcpy 以及strcmp strcpy几个库函数的实现

memmove和memcpy 1.memmove 函数原型:void *memmove(void *dest, const void *source, size_t count) 返回值说明:返回指向dest的void *指针 参数说明:dest,source分别为目标串和源串的首地址.count为要移动的字符的个数 函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.

memmove 和 memcpy的区别

memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count); 他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确. 第一种情况

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

1.与字符串函数strcpy区别: memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作. memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止. 2.函数说明: memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中. memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmo

内存操作函数memmove,memcpy,memset

通过字符串的学习,我们知道字符串操作函数的操作对象是字符串,并且它的结束标志是结束符\0,当然这个说的是不 受限制的字符串函数.然而当我们想要将一段内存的数据复制到另一块内存时,我们不能使用字符串操作函数,当然也 不能一个一个复制,所以就引入了内存操作函数. memcpy函数原型: void *memcpy(void *dst, const void *src, size_t size);将一块内存的数据复制到另一块内存.当两块内存重叠              的时候,memcpy就不能保证拷

memcpy 与 memmove

memcpy:C和C++当中使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 函数原型 void* memcpy(void* dest, const void* src, size_t count) 函数返回指向dest的指针: mencpy与memmove的区别:根据源代码编写自己的Mencpy 与Memmove #include <iostream> using namespace std; #incl

memcpy、memmove、memset及strcpy函数实现和理解

memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h>, 在C++中需要包含的头文件是#include其函数原型如下: void *memcpy(void *dest, const void *src, size_t n); 其功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 库函数中的memcpy不能处理sr