memcpy 和memmove 都是把一个内存块拷贝到另一个内存块,其区别为:
memcpy 不考虑源内存块和 目标内存块 是否重叠的情况,即
source | |
dest | |
而memmove则考虑了这一情况,当遇到这种情况的时候,拷贝是从最高位开始,这样就保证source中还没拷贝的块不会因为dest的原因被修改。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
/**
*mymemcpy 把source 复制到dest, 返回dest的头指针, count 是指针长度
**/
void * mymemcpy(void * dest, const void * source, size_t count)
{
assert(dest != NULL || source != NULL);
void * ret = dest; //记录dest初始地址
while(count--)
{
*(char *)dest = *(char *)source;
//*dest = *source; void * 只知道所指内容的起始地址,不知道所指内容的大小(占几个字节),所以无法正确引用
dest = (char *)dest + 1;
source =(char *)source + 1;
}
return ret;
}
/**
* memcpy 没有考虑当source 和dest 有以下内存地址重叠的情况:
* source | |
* dest| |
* 即source向dest复制的时候,会改变source后面需要复制的内容。
* 解决办法,当这种情况出现时,可以考虑从最高位向最低位复制。
**/
void * mymemmove(void * dest, const void * source, size_t count)
{
assert(dest != NULL || source != NULL);
void * ret = dest;
if(dest < source || dest > (char *) source + count -1) //不会出现重叠情况
{
while(count--)
{
*(char *) dest = * (char *) source;
dest = (char *)dest + 1;
source = (char *)source + 1;
}
}
else
{
while(count--)
{
*((char *) dest + count) = *((char *) source + count );
}
}
return ret;
}
int main()
{
char a[] = "abcdefgh";
//mymemcpy(a+2, a, 4);
mymemmove(a+2, a, 4);
printf("%s\n",a);
return 0;
}
分享到:
相关推荐
今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同。 memcpy和memmove在MSDN的定义如下: 从两者的声明来看的确没有区别,我们来...
那么既然memcpy和memmove二者都是内存拷贝,那二者究竟有什么区别呢? 先说memcpy 你有没有好好的参加过一场C++笔试。让你写出memcpy的实现,这是多么常见的笔试题啊。现在,拿起你的演算纸和笔;是的,是笔和纸,...
《memcpy与memmove在C语言中的使用详解》 在C语言中,`memcpy`和`memmove`是两个用于内存操作的重要函数,它们都属于C标准库中的`<string.h>`或`<memory.h>`头文件。这两个函数的主要功能是从源内存区域复制数据到...
本文将深入解析五个常用的C语言函数:`strcpy`、`memcpy`、`memmove`、`strcat`和`strcmp`的实现原理与功能特性,这些函数在处理字符串复制、连接、比较以及内存拷贝时扮演着关键角色。 ### 1. `strcpy` - 字符串...
在深入探讨如何不调用C库函数实现`memmove`和`memcpy`的功能之前,我们首先需要理解这两个函数的基本概念及其在计算机编程中的作用。`memcpy`和`memmove`都是用于内存操作的重要函数,它们负责将源内存区域的数据...
memmove、memcpy 和 memccpy 是三个常用的内存拷贝函数,它们都用于从一个缓冲区拷贝数据到另一个缓冲区,但它们之间有一些区别。 memmove 函数 memmove 函数的定义为:`void *memmove(void *dest, const void *...
例如,如果我们需要复制一个数组的部分内容到同一个数组的另一个位置时,需要使用 memmove 函数,而不是 memcpy。 memcpy 和 strcpy 都是标准 C 库函数,但是它们的用途和应用场景不同。strcpy 主要用于复制字符串...
在C和C++编程语言中,`memmove()` 和 `memcpy()` 都是用于复制内存区域的函数,但它们在处理重叠内存区域时的行为不同。这篇文章将详细探讨这两个函数的区别以及它们的实现方法。 首先,`memcpy()` 函数位于 `...
它不同于`memcpy`,`memmove`在处理重叠区域时依然能保证数据的正确性。本文将深入探讨`memmove`的原理,并通过汇编语言展示其实现细节。 首先,我们要理解`memmove`函数的基本定义。在C语言中,`memmove`函数的...
与memcpy的区别 `memcpy`函数在处理内存拷贝时假设源区和目标区不重叠,如果它们确实重叠,可能会导致数据损坏。而`memmove`则能处理任何情况下的内存拷贝,包括重叠区域,因此在可能涉及重叠的内存操作时,应优先...
防范memcpy溢出的方法包括使用安全的内存拷贝函数,如memcpy_s或memmove,它们会检查目标缓冲区的大小,防止溢出;使用栈保护机制,如Canary值,检测栈溢出;以及使用地址空间布局随机化(ASLR)等技术,增加攻击的...
尽管`memmove`提供了安全的内存移动,但为了追求更高的性能,开发者有时会选择自己实现`memcpy`,特别是针对不涉及重叠区域的情况,以减少中间步骤,提高效率。 以下是一个简单的`Memcpy`函数实现,它检查了源和...
2. **与`strcpy`的区别**:`strcpy`函数仅用于字符串的复制,并且会自动复制到空字符`\0`为止,而`memcpy`则不考虑空字符,它可以用来复制任意类型的字节序列。 3. **目标内存的管理**:每次使用`memcpy`之前必须...
《深入理解memcpy的实现与应用》 在编程领域,内存操作是基础且至关重要的环节。`memcpy`函数作为C语言中的一个经典...在实际开发中,应根据具体需求和性能要求选择使用`memcpy`、`memmove`或自定义的内存拷贝函数。
`memmove()`函数用于将内存从一个位置移动到另一个位置,即使这两个位置重叠也能正确处理。 **参数说明**: - `destination`: 指向目标内存区域的指针。 - `source`: 指向源内存区域的指针。 - `num`: 要移动的字节...
### `memcpy`与`strcpy`的区别 1. **复制内容**:`strcpy`只能复制字符串(以`\0`结尾的字符序列),而`memcpy`可以复制任何类型的数据,不限于字符串。 2. **复制方法**:`strcpy`不需要指定长度,它会一直复制...
如果它们重叠,行为是未定义的,可能不会按预期工作,此时应该使用`memmove`函数来安全地处理重叠区域的复制。 2. **遇到终止符**:与`strcpy`不同,`memcpy`不会在遇到`\0`字符时停止复制,它会一直复制到指定的`n...