`

“关于memcpy和memmov的区别”的思考

阅读更多
引用
大家注意!这篇文章的思考有问题。当dest < source的时候,采取从高位向低位赋值,是有问题的,如果dest+count-1 > source && dest < source的情况。

先看实现:

void* memcpy(void* dest, void* source, size_t count)
{
	void* ret = dest;
	//copy from lower address to higher address
	while (count--)
		*dest++ = *source++;
	return ret;
}

void* memmove(void* dest, void* source, size_t count)
{
	void* ret = dest;

	if (dest <= source || dest >= (source + count))	{
		//Non-Overlapping Buffers
		//copy from lower addresses to higher addresses
		while (count --)
			*dest++ = *source++;
	}
	else {
		//Overlapping Buffers
		//copy from higher addresses to lower addresses
		dest += count - 1;
		source += count - 1;
		while (count--)
			*dest-- = *source--;
	}

	return ret;
}
   


注意区别:
memcpy需要保证复制以后,原有数据source不被破坏。
memmove有移动的意思,原有数据可能,注意是可能被破坏掉。但memmove不清除原有数据。

但我有一个想法:memmove的实现显然有累赘的代码,其实无论区域是否重叠,用高位向低位复制的方法肯定不会有问题,又何苦要用if...else呢,按如下代码即可:
void* memmove(void* dest, void* source, size_t count)
{
	void* ret = dest;

	//Think of Overlapping Buffers
	//copy from higher addresses to lower addresses
	dest += count - 1;
	source += count - 1;
	while (count--)
			*dest-- = *source--;

	return ret;
}


我想,之所以采用判断的方式分别进行,主要是展现一下move的思路,增强可读性吧,当两个区域不会重叠的时候,memmove和memcpy是等价的。

通过实现方法可以看出:move并未清除原有数据。但move比cpy更安全,在使用cpy的时候,一定要考虑区域重叠的问题,另外还要考虑缓冲区溢出的问题啊。

还要知道memncpy能确保缓冲区不溢出。但要根据你的情况,如果char *str_source="hello", char buf[1024]的话,你用memcpy就可以了。用memncpy是没必要的。还可以用strcpy,更方便,毕竟已经确保不可能溢出了。
1
1
分享到:
评论

相关推荐

    DPDK中的memcpy性能优化及思考.pdf

    DPDK中的memcpy性能优化及思考.pdf

    memcpy 和strcpy 的区别

    memcpy 和 strcpy 的区别 memcpy 和 strcpy 都是标准 C 库函数,都是用于从一块内存复制一段连续的数据到另一块内存,但是它们之间存在一些关键的区别。 首先,strcpy 函数用于复制字符串,它从源字符串的起始地址...

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

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

    C语言中memcpy 函数的用法详解

    c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。 void* memcpy(void* destination, const void* source, size_t num); void*...

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

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

    linux memcpy源码

    ### Linux memcpy 源代码分析 #### 一、概述 `memcpy`是C语言标准库中的一个函数,用于将内存中的数据从一个位置复制到另一个位置。Linux内核中的`memcpy`实现通常针对不同的架构进行了优化,以提高性能。本文档...

    memcpy的用法

    memcpy 函数的使用和实现原理 memcpy 函数是 C 语言标准库中的一种内存复制函数,用于将一个内存区域的内容复制到另一个内存区域。其函数原型为: void *memcpy(void *dest, const void *src, size_t count); ...

    memmove、memcpy和memccpy简介.docx

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

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

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

    memcpy函数的实现

    一个使用memcpy的实现版本,考虑内存重叠以及效率

    Memset、Memcpy、Strcpy 的作用和区别

    总结一下,Memset、Memcpy和Strcpy的主要区别在于它们各自的操作对象和目的:Memset用于对内存进行设置,通常是初始化;Memcpy用于内存对象的拷贝,注重于复制的数据量;Strcpy用于字符串拷贝,重点在于字符串的复制...

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

    总的来说,理解和掌握memcpy溢出利用技术对于网络安全专业人员至关重要,这不仅可以帮助他们在防御端发现并修复漏洞,还能让他们在攻击面了解可能的威胁,从而提高系统的整体安全性。同时,这也提醒开发者在编程时应...

    memcpy和strcpy源码

    网上参考资料写的memcpy以及strcpy的源码,希望能帮助大家。

    strcpy与memcpy的区别-.pdf

    其中,strcpy和memcpy是两个常用的函数,虽然它们都用于复制内存中的数据,但它们的功能、使用场景以及操作方式有着明显的区别。 首先,strcpy函数是C标准库中的一个字符串处理函数,其原型为`char *strcpy(char *...

    strcpy与memcpy的区别-.docx

    在C语言和C++中,`strcpy`和`memcpy`都是用于复制内存区域的函数,但它们在使用场景和操作方式上存在显著的区别。这里我们将深入探讨这两个函数的工作原理、适用情况以及潜在的安全隐患。 首先,`strcpy`是C标准库...

    strcpy,sprintf,memcpy的区别,Sizeof与Strlen的区别.docx

    关于strcpy和memcpy的区别,strcpy只适用于字符串拷贝,且自动识别'\0'作为结束标志,而memcpy适用于任意数据类型,但需要用户明确提供长度信息,不考虑字符串的结束标志。 然后,我们来看sizeof和strlen的区别。...

    C语言 strcpy和memcpy区别详细介绍

    `strcpy`和`memcpy`的主要区别如下: 1. **复制内容不同**:`strcpy`只能复制字符串,即以`\0`结尾的字符序列;而`memcpy`可以复制任何类型的数据,包括字符数组、整型、结构体或类对象等。 2. **复制方法不同**:...

    深入理解strcpy与memcpy的区别

    深入理解`strcpy`与`memcpy`的区别是C语言编程中非常关键的一个知识点,尤其是在处理内存复制操作时。这两个函数都是C标准库中的成员,但它们的功能和使用场景有所差异。 `strcpy`函数专用于字符串复制。它的原型为...

Global site tag (gtag.js) - Google Analytics