`
wss71104307
  • 浏览: 224372 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

memcopy 和memmove

阅读更多

1.memmove

函数原型:void *memmove(void *dest, const void *source, size_t count)

返回值说明:返回指向dest的void *指针

参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数

函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

 

2.memcpy

 

函数原型:void *memcpy(void *dest, const void *source, size_t count);

返回值说明:返回指向dest的void *指针

函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。

 

3.两者区别

  函数memcpy()   从source  指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。  
  而memmove(),如果两函数重叠,赋值仍正确进行。

  memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy;  
  如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove。

 memcpy的效率会比memmove高一些,如果还不明白的话可以看一些两者的实现:

 

void *memmove(void *dest, const void *source, size_t count)
{
 assert((NULL != dest) && (NULL != source));
 char *tmp_source, *tmp_dest;
 tmp_source = (char *)source;
 tmp_dest = (char *)dest;
 if((dest + count<source) || (source + count) <dest))
 {// 如果没有重叠区域
   while(count--)
     *tmp_dest++ = *tmp_source++;
}
else
{ //如果有重叠
 tmp_source += count - 1;
 tmp_dest += count - 1;
 while(count--)
   *--tmp_dest = *--tmp;
}
return dest;
}
 
void *memcpy(void *dest, const void *source, size_t count)
{
 assert((NULL != dest) && (NULL != source));
 char *tmp_dest = (char *)dest;
 char *tmp_source = (char *)source;
 while(count --)//不对是否存在重叠区域进行判断
   *tmp_dest ++ = *tmp_source ++;
 return dest;
}
 

 

分享到:
评论

相关推荐

    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