C/C++ memmove与memcpy的区别及实现
来源:互联网 发布:java抽象类构造函数 编辑:程序博客网 时间:2024/06/06 15:07
1.与字符串函数strcpy区别:
- memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。
- memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止。
2.函数说明:
- memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
- memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。
3.拷贝情况:
拷贝的具体过程根据dst内存区域和src内存区域可分为三种情况:
1.当src内存区域和dst内存区域完全不重叠
2.当src内存区域和dest内存区域重叠时且dst所在区域在src所在区域前
3.当src内存区域和dst内存区域重叠时且src所在区域在dst所在区域前
上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。
4.代码实现
memcpy:
void* _memcpy(void* dest, const void* src, size_t count){assert(src != nullptr&&dest != nullptr);//判断dest指针和src指针是否为空,若为空抛出异常char* tmp_dest = (char*)dest;const char* tmp_src = (const char*)src;//将指针dest和指针src由void强转为char,//使得每次均是对内存中的一个字节进行拷贝while (count--)*tmp_dest++ = *tmp_src++;return dest;}
memmove:
void* _memmove(void* dest, const void* src, size_t count){assert(src != nullptr&&dest != nullptr);//判断dest指针和src指针是否为空,若为空抛出异常char* tmp_dest = (char*)dest;const char* tmp_src = (const char*)src;if (tmp_src < tmp_dest)//当src地址小于dest地址时,从头进行拷贝while (count--)*tmp_dest++ = *tmp_src++;else if (tmp_src > tmp_dest)//当src地址大于dest地址时,从后进行拷贝{tmp_src += count - 1;tmp_dest += count - 1;while (count--)*tmp_dest-- = *tmp_src;}//else(tmp_src==tmp_dest) 此时不进行任何操作return dest;}
阅读全文
0 0
- C/C++ memmove与memcpy的区别及实现
- C/C++ memmove与memcpy的区别及实现
- C语言 string及memcpy,memmove函数的模拟实现
- 【C语言】memcpy函数和memmove函数的实现与区别
- C基础:memmove和memcpy的区别
- strcpy、memcpy、memmove的区别及实现
- memcpy与memmove的区别及源码
- memcpy和memmove的区别与实现
- memcpy和memmove的区别与实现
- memcpy和memmove的区别与实现
- 转:C/C++:memmove、memcpy、strcpy三者的区别
- 转:C/C++:memmove、memcpy、strcpy三者的区别
- C/C++:memmove、memcpy、strcpy三者的区别
- C/C++:memmove、memcpy、strcpy三者的区别
- C/C++:memmove、memcpy、strcpy三者的区别
- C/C++:memmove、memcpy、strcpy三者的区别
- 转:C/C++:memmove、memcpy、strcpy三者的区别
- memcpy与memmove的区别
- 详解mapper.xml文件
- 带随机指针域的单链表的复制
- go语言string、int、int64互相转换
- MK_CONTROL 与 VK_CONTROL 有什么区别,用&与用==的区别
- Java基础初始化
- C/C++ memmove与memcpy的区别及实现
- 多线程(start-point & end-point)
- 使用sqoop将window环境中的oracle数据导入到hdfs出错
- Windows蓝牙通信的开发
- servlet的执行流程
- springboot+swagger2事例
- 微信小程序入门开发
- win10系统中eNSP AR启动失败错误代码40及VirtualBox不兼容的解决办法
- 今年最新的30个Android库,你了解吗?