`
vyloy
  • 浏览: 78766 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

memcpy和memmove

    博客分类:
  • C++
阅读更多
函数原型:

void *memcpy(void *dest, const void *src, size_t n)

void *memmove(void *dest, const void *src, size_t n)

两者的功能基本相同,唯一不同的是,当 dest 和 src 有重叠的时候选用不同的函数可能会造成不同的结果。

memcpy的原理是从src的低地址开始到高地址,单个字节复制,如果src与dest有重叠,并行src的地址低于dest的话,将会得不到想要的结果,如果src的址高于dest的话,则不会出现这种情况:


实例:

#include <iostream>
#include <string.h>

using namespace std;
int main(void)
{
	int i = 0;
	int a[10];
	//init

	for (; i < 10; i ++)
	{
		a[i] = i;

	}

	//copy
	memcpy(&a[4], a, sizeof(int) * 6);

	//output
	for (i = 0; i < 10; i ++)
	{
		cout<<”a["<<i<<"]:”<<a[i]<<endl;
	}

	return 0;

}


输出结果为:

a[0]:0
a[1]:1
a[2]:2
a[3]:3
a[4]:0
a[5]:1
a[6]:2
a[7]:3
a[8]:0
a[9]:1

将第17行改为memmove(&a[4], a, sizeof(int) * 6),结果如下:

a[0]:0
a[1]:1
a[2]:2
a[3]:3
a[4]:0
a[5]:1
a[6]:2
a[7]:3
a[8]:4
a[9]:5

看一下memcpy与memmove的实现

代码:

void* memcpy(void* dest, void* source, size_t count)

{

void* ret = dest;

//memcpy只是简单的字节copy,没有处理重叠的情况

while (count--)

*dest++ = *source;

return ret;

}




void* memmove(void* dest, void* source, size_t count)

{

void* ret = dest;

if (dest <= source || dest >= (source + count))

{

//如果没有重叠或是有重叠重目标地址低于源地址

//从低地址开始复制

while (count--)

*dest++ = *source++;

}

else

{

//如果有重叠且目标地址高于源地址

//从高地址开始复制

dest += count - 1;

source += count - 1;

while (count--)

*dest-- = *source--;

}

return ret;

}


作者:翁志艺
分享到:
评论

相关推荐

    C++中memcpy和memmove的区别总结

    那么既然memcpy和memmove二者都是内存拷贝,那二者究竟有什么区别呢? 先说memcpy 你有没有好好的参加过一场C++笔试。让你写出memcpy的实现,这是多么常见的笔试题啊。现在,拿起你的演算纸和笔;是的,是笔和纸,...

    关于memcpy和memmove的一点重要说明

    今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同。 memcpy和memmove在MSDN的定义如下: 从两者的声明来看的确没有区别,我们来...

    常用函数的实现strcpy,memcpy,memmove,strcat,strcmp原型

    常用函数的实现strcpy,memcpy,memmove,strcat,strcmp原型

    memcpy及memmove.pdf

    。。。

    C语言面试总结

    1.11 memcpy和memmove函数的实现 1.12 strcat函数实现 1.13 使用库函数atoi,将char *→int 1.14 使用库函数itoa,将int→char * 1.15 不使用库函数,将int→char * 1.16 不使用库函数,将char *→int 1.17 求两个...

    copyarr_copyarry_

    数组拷贝,不使用memcpy和memmove,有很多坑,避免内存溢出

    不调用C库函数实现memmove-memcpy函数功能

    不调用C库函数实现memmove-memcpy函数功能。

    你必须知道的495个C语言问题

    第1章 声明和初始化 基本类型 1.1 我该如何决定使用哪种整数类型? 1.2 为什么不精确定义标准类型的大小? 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的...

    memmove、memcpy和memccpy简介.docx

    。。。

    《你必须知道的495个C语言问题》

    1.7 怎样声明和定义全局变量和函数最好? 4 1.8 如何在C中实现不透明(抽象)数据类型? 5 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态...

    深入理解memmove()与memcpy()的区别以及实现方法

    本篇文章是对memmove()与memcpy()的区别以及实现方法进行了详细的分析介绍,需要的朋友参考下

    C语言函数库函数详细介绍手册

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C 语言库函数使用手册

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C语言库函数速查 CHM

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C语言函数速查手册

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C语言函数速查

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

Global site tag (gtag.js) - Google Analytics