`
vyloy
  • 浏览: 80364 次
  • 性别: 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的定义如下: 从两者的声明来看的确没有区别,我们来...

    memmove、memcpy和memccpy简介.docx

    memmove、memcpy 和 memccpy 函数简介 memmove、memcpy 和 memccpy 是三个常用的内存拷贝函数,它们都用于从一个缓冲区拷贝数据到另一个缓冲区,但它们之间有一些区别。 memmove 函数 memmove 函数的定义为:`...

    memcpy及memmove.pdf

    在C语言中,`memcpy`和`memmove`是两个用于内存操作的重要函数,它们都属于C标准库中的`&lt;string.h&gt;`或`&lt;memory.h&gt;`头文件。这两个函数的主要功能是从源内存区域复制数据到目标内存区域,但在处理内存重叠问题时,...

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

    本文将深入解析五个常用的C语言函数:`strcpy`、`memcpy`、`memmove`、`strcat`和`strcmp`的实现原理与功能特性,这些函数在处理字符串复制、连接、比较以及内存拷贝时扮演着关键角色。 ### 1. `strcpy` - 字符串...

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

    在深入探讨如何不调用C库函数实现`memmove`和`memcpy`的功能之前,我们首先需要理解这两个函数的基本概念及其在计算机编程中的作用。`memcpy`和`memmove`都是用于内存操作的重要函数,它们负责将源内存区域的数据...

    c的几个string库函数简单实现

    本文将详细介绍C语言中的string库函数的实现,包括strlen、strcpy、strcat、strcmp、strstr、memcpy和memmove等函数的实现。这些函数都是C语言中常用的字符串操作函数, MASTERING它们对于编写高效的程序至关重要。 ...

    C程序设计语言(英文第2版)

    **内存管理**:C语言提供了动态内存分配(malloc和free)以及内存复制(memcpy和memmove)等功能。 **标准库**:包括输入/输出(stdio.h)、数学运算(math.h)、字符串处理(string.h)等丰富的函数库。 通过学习...

    C语言函数大全(按函数库分类).doc.pdf

    这些函数是字符串编程的基础,例如memcpy和memmove用于复制内存区域,strcpy和strncpy用于复制字符串,strlen用于计算字符串长度,而strcmp用于比较两个字符串。 float.h头文件虽然没有在内容摘要中详细列出,但它...

    C语言的秘密.pdf

    最后,文件内容还涉及到了C语言标准库函数的使用,例如输入输出流库中的 cout 函数,以及与内存操作相关的函数如 memcpy 和 memmove。 从以上内容可以看出,C语言是一门功能强大、接近硬件底层的编程语言,它不仅...

    memcpy 和strcpy 的区别

    例如,如果我们需要复制一个数组的部分内容到同一个数组的另一个位置时,需要使用 memmove 函数,而不是 memcpy。 memcpy 和 strcpy 都是标准 C 库函数,但是它们的用途和应用场景不同。strcpy 主要用于复制字符串...

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

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

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

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

    memmove_test.zip

    它不同于`memcpy`,`memmove`在处理重叠区域时依然能保证数据的正确性。本文将深入探讨`memmove`的原理,并通过汇编语言展示其实现细节。 首先,我们要理解`memmove`函数的基本定义。在C语言中,`memmove`函数的...

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

    在C和C++编程语言中,`memmove()` 和 `memcpy()` 都是用于复制内存区域的函数,但它们在处理重叠内存区域时的行为不同。这篇文章将详细探讨这两个函数的区别以及它们的实现方法。 首先,`memcpy()` 函数位于 `...

    memmove函数.docx

    与`memcpy`函数不同的是,`memmove`能够正确处理源区和目标区的重叠情况,确保数据的正确无损复制。 ### 2. 工作原理 `memmove`函数在处理内存重叠时,采用从后向前拷贝的方式,避免了在拷贝过程中源数据被提前...

    网络渗透——BSD的memcpy溢出利用技术

    防范memcpy溢出的方法包括使用安全的内存拷贝函数,如memcpy_s或memmove,它们会检查目标缓冲区的大小,防止溢出;使用栈保护机制,如Canary值,检测栈溢出;以及使用地址空间布局随机化(ASLR)等技术,增加攻击的...

Global site tag (gtag.js) - Google Analytics