memcpy与memmove的区别
memmove 和 memcopy
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;
}
转自:http://www.cppblog.com/colorful/archive/2012/04/23/172483.aspx
memcpy与memmove的区别相关推荐
- memcpy和memmove的区别以及内存重叠问题
memcpy和memmove的区别以及内存重叠问题 转自:https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数 ...
- memcpy和memmove的区别
memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,其原型分别如下: void *memcpy(void *dst, const void *src, size_ ...
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
一.函数介绍: 1.memcpy 函数原型:extern void *memcpy(void *dest, const void *src, size_t count); 用法:#include< ...
- memcpy and memmove
12.25 memcpy() 和 memmove() 有什么区别? 如果源和目的参数有重叠, memmove() 提供有保证的行为.而 memcpy() 则不能提供这样的保证, 因此可以实现得更加有 ...
- strcpy,memcpy和memmove区别
strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy ...
- 关于memcpy和memmove两函数的区别
http://blog.csdn.net/caowei840701/article/details/8491836 [cpp] view plain copy <p> 关于memcpy和m ...
- memcpy和memmove函数的区别
文章目录 前言 memcpy函数 memmove函数 memcmp函数 前言 c语言<string.h>库里面有很多的字符函数,比如memcpy,memmove,memcmp等,这些函数是 ...
- memcpy 头文件_C|memcpy()和memmove()的比较及实现
memcpy()和memmove()函数的原型如下: void * memcpy ( void * dst, const void * src, size_t num ); void * memmov ...
- (memcpy,memmove...)内存函数还不会??别怕,我来助你一臂之力
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.内存函数是什么 二.内存函数的分类(常见) 1.memcpy memcpy的模拟实现 2.memmove memmov ...
最新文章
- 吴恩达:AI未来将呈现四大发展趋势
- 页面样式乱了,但是又感觉各种js,css都引入了
- Gut:人体最初的微生物起源与生殖健康
- shell 基本使用
- java圆角矩形_如何在java中使用普通矩形轮廓绘制圆角矩形
- 02 面向对象之:类空间问题以及类之间的关系
- 具有只读属性的ComboBox
- leetcode851. 喧闹和富有(dfs)
- 【Python基础知识-pycharm版】第六节-控制语句
- Flutter高级第3篇:底部 Tab 切换保持页面状态的几种方法
- 微信小程序开发入门与实践
- 【C/C++】C++基本语法
- (测试可用)针式打印机打印WEB页面字体不清晰,解决方法
- 串口和TCP测试工具
- 企业IT架构的发展历程
- Linux指令——tailf
- 进击ReactNative-疾如风
- Unity 给代码添加命名空间
- JVM性能调优(一)(JVM参数详解、内存分析等)
- 往事不回头,今后不将就~~Fighting