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

memcopy 和 memmove 的实现

    博客分类:
  • c
 
阅读更多

一 memcopy 的实现

 

memcopy 不考虑源内存和目标内存之间的重叠, 逐字节地拷贝, 代码比较简单

 

 

void my_memcopy(void *src, void *dst, int size)
{
	char *psrc, *pdst;

	psrc = (char *)src;
	pdst = (char *)dst;

	while (size--) {
		*pdst++ = *psrc++;
	}
}

 

二 memmove 的实现

memmove 要考虑源内存和目标内存之间的重叠, 概括起来, 有 3 种情况:

(1) src 和 dst 没有重叠, 其充要条件是 |src - dst| >= size, 如下图所示:

 

(2) src 和 dst 有重叠, 而且 dst < src, 其充要条件是 dst < src && (src - dst) < size 如下图所示:

(3) src 和 dst 有重叠, 而且 src< dst, 其充要条件是 src < dst && (dst - src) < size 如下图所示:

对于第 (1) 和第 (2) 中情况, 可以这样移动数据: 从 src 开始, 由低地址向高地址逐字节拷贝.

对于第 (3) 中情况, 则必须这样移动数据: 从最后一个字节 (src + size -1) 开始, 由高地址向低地址逐字节拷贝.

 

代码如下:

 

 

void my_memmove(void *src, void *dst, int size)
{
	char *psrc, *pdst;

	psrc = (char *)src;
	pdst = (char *)dst;

	if (pdst < psrc || (pdst - psrc) > size) {
		while (size--) {
			*pdst++ = *psrc++;
		}
	} else {
		psrc = psrc + size - 1;
		pdst = pdst + size - 1;
		while (size--) {
			*pdst-- = *psrc--;
		}
	}
}
 

 

  • 大小: 1.8 KB
  • 大小: 1.8 KB
  • 大小: 1.1 KB
  • 大小: 1.1 KB
分享到:
评论

相关推荐

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

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

    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` - 字符串...

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

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

    memmove、memcpy和memccpy简介.docx

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

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

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

    memcpy函数的实现代码

    ### memcpy函数实现详解 在计算机编程中,尤其是C/C++编程领域,`memcpy`函数是进行内存块复制的重要工具之一。...理解和掌握`memcpy`函数的基本原理和实现细节对于编写高效且可靠的代码至关重要。

    memcpy函数的实现代码.docx

    `memcpy`函数是C语言标准库中的一个非常重要的内存操作函数,用于将一块内存区域的内容复制到另一块...在面试或实际编程中,能够熟练掌握`memcpy`和`memmove`的使用和实现原理,可以体现出对C语言底层机制的深入理解。

    memcpy函数的实现代码.pdf

    `memcpy`函数是C语言标准库中的一个函数,...理解和实现`memcpy`可以帮助我们深入理解内存管理、指针操作以及低级别的数据移动策略。在面试或实际编程中,了解这些基础是非常重要的,因为它涉及到性能优化和错误预防。

    memcpy实现.pdf

    总结来说,`memcpy`的实现需要考虑地址重叠的情况,而优化的`Memcpy`函数通过判断源和目标的相对位置,选择了合适的复制方向,避免了可能的错误。虽然`memmove`提供了安全的保证,但在特定场景下,自定义的`memcpy`...

    memcpy实现 (2).pdf

    `memcpy`函数作为C语言中的一个经典内存拷贝工具,它的使用广泛且常见,但其背后的实现原理和潜在的问题往往被忽视。本文将深入探讨`memcpy`的实现,并分析其在地址重叠情况下的行为,以及为何在某些情况下需要...

    memcpy 和strcpy 的区别

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

    memcpy函数的实现代码 (2).pdf

    在面试中,理解和熟悉memcpy的内部机制以及如何优化实现是非常重要的。 首先,我们来看原始的memcpy函数实现: ```c void memcpy(void *dest, void *src, size_t n) { char *pd = (char *)dest; char *ps = ...

    memmove_test.zip

    理解和掌握`memmove`的原理及实现,有助于我们编写更安全、更高效的代码,特别是在处理内存敏感的问题时。通过对`memmove_test.zip`中的代码进行学习和实践,开发者可以深入理解内存管理的核心机制,从而在实际编程...

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

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

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

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

    memmove函数.docx

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

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

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

Global site tag (gtag.js) - Google Analytics