linux内核中memcpy和memmove函数的区别和实现

linux内核中memcpy和memmove函数的区别和实现,第1张

memcpy的效率会比memmove高一些,如果还不明白的话可以看一些两者的实现,平时很少有重叠的例子,所以只有特殊情况才考虑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

}

memcpy函数用法

memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中。

函数原型

void *memcpy(void *dest, const void *src, size_t n)

折叠编辑本段功能

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

折叠编辑本段所需头文件

C语言:#include<string.h>

C++:#include<cstring>

折叠编辑本段返回值

函数返回指向dest的指针。

折叠编辑本段说明

1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.

2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

注意:source和destin都不一定是数组,任意的可读写的空间均可。

折叠编辑本段函数实现

Windows中

coreutils中

Linux中:

折叠编辑本段程序实例

程序例example1

作用:将s中的字符串复制到字符数组d中。

输出结果:Golden Global View

example2

作用:将s中第13个字符开始的4个连续字符复制到d中。(从0开始)

输出结果: View

example3

作用:复制后覆盖原有部分数据

输出结果:

destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6

destination after memcpy: ******************************as6

strcpy和memcpy主要有以下3方面的区别。

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7293305.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存