memcpy,memmove函数实现及区别

原创 2016年08月30日 19:57:20

1 功能

memcpy:内存拷贝函数。void*memcpy(void* dest,void* src,size_t n),memcpy函数复制src指向的空间里前n个         字节到dest指向的空间。这里与strcpy不同的是strcpy函数只能拷贝字符串,而memcpy拷贝的是内存里的东         西,包括字符串,整型,结构体等等。
memmove:void* memmove(void* dest,void* src size_t n),memove函数的返回类型和参数与memcpy函数一样,          他们的功能也是一样的,都是复制src所指向空间里的前n个字节到dest所指向的空间。唯一的区别是,            memcpy函数无法保证当内存重叠时拷贝的结果依然正确,而memmove函数可以做到。

2 区别

    如图所示,当使用memcpy进行内存拷贝时,第一种情况可以正常的得到拷贝内容,不存在内存重叠的情况。

    但是当遇到如下图所示的情况,也就是内存重叠的情况时,就会发生内容丢失的情况。

    上图所示的情况当src的前一个字节拷贝到dest时,src所需拷贝的最后一个字节由于和dest内存重叠,所以其内容就变成了src的第一个字节的内容,这就会导致src原本的最后一个字节内容丢失。
这个时候就需要使用memmove函数。

3 代码实现

memcpy
void* my_memcpy(void* dest,void* src,size_t n)
{
	assert(dest);
	assert(src);
	char* pdest = (char*)dest;
	char* psrc = (char*)src;
	while ((n--)&&(*pdest++ = *psrc++))
	{
		;
	}
	return dest;
}
memmove
void* my_memmove(void* dest, void* src, size_t n)
{
	assert(dest);
	assert(src);
	char* pdest = (char*)dest;
	char* psrc = (char*)src;
	if (src > dest)
	{
		while ((n--) && (*pdest++ = *psrc++))
		{
			;
		}
	}
	else
	{
		char* ppdest = pdest + n -1;
		char* ppsrc = psrc + n -1;
		while ((n--) && (*ppdest-- = *ppsrc--))
		{
			;
		}
	}
	return dest;
}

4 安全性

    在strcpy,strncpy,memcpy和memmove这四个库函数中,安全性是递增的,前三个函数均没有考虑到内存重叠的问题,所以相对来说memmove函数的安全性最高。


版权声明:本文为博主原创文章,未经博主允许不得转载。

实现时间复杂度为O(nlogn)的链表排序算法

简介链表排序是一道常见的关于链表的算法题,往往我们会使用冒泡排序或者选择排序这两种算法来解决这个问题。但是它们的时间复杂度是O(n²),效率不高。所以今天我们要实现时间复杂度O(nlogn)的算法就不...
  • MBuger
  • MBuger
  • 2017年04月20日 15:15
  • 791

希尔排序算法(排序详解)

希尔排序  基本思想 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提...

linux内核中memcpy和memmove函数的区别和实现

linux内核中memcpy和memmove函数的区别和实现 Kernel version:2.6.32 CPU architecture:ARM Author:ce123(...

memmove和memcpy函数的区别及实现

一、memmove()和memcpy()函数的strcpy()函数的区别;(1)使用的类型不同,strcpy()函数只对字符串进行操作;memmove()和memcpy()函数对所有类型都适用,为内存...

【C语言】memcpy函数和memmove函数的实现与区别

C语言

关于memcpy和memmove两函数的区别

http://blog.csdn.net/caowei840701/article/details/8491836 [cpp] view plain copy ...

关于memcpy和memmove两函数的区别

关于memcpy和memmove两个c标准库函数,其功能都是将一块内存区域中的指定大小内容复制到目标内存中,在翻阅c标准库实现的源代码我们发现他们是有区别的。首先看memcpy的实现: void * ...

strcpy、memset、memmove、memcpy和memccpy函数的使用和区别

原创地址:http://blog.csdn.net/Andy_YF/article/details/7101227 1、strcpy() 原型: [html] v...

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

memcpy与memmove的区别和实现
  • lyl_312
  • lyl_312
  • 2016年05月18日 23:18
  • 171
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:memcpy,memmove函数实现及区别
举报原因:
原因补充:

(最多只允许输入30个字)