memmove和memcpy函数的区别及实现
一、memmove()和memcpy()函数和strcpy()函数的区别;
(1)使用的类型不同,strcpy()函数只对字符串进行操作;memmove()和memcpy()函数对所有类型都适用,为内存拷贝;
(2)strcpy()以’\0’为拷贝的结束条件;而memmove()和memcpy()函数则是以第三个参数num进行控制拷贝;
二、函数说明:
1.memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
2.memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝
三、memmove()和memcpy()函数的区别和联系:
相同点: 两个都是内存拷贝,对所有类型都适用;
不同点:
(1)memcpy()函数是从前往后拷贝;假入出现内存重叠的现象;拷贝结果可能出错;
(2)memmove()函数在memcpy()函数的基础上加入了对内存重叠拷贝的处理;引入了倒序拷贝的方式处理内存重叠的某些情况;保证拷贝的正确性;
综上:在现实中使用memmove()函数会比较好一点;
四、各种拷贝情况:
上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。
五、模拟实现:
memcpy:
//模式实现memcpy(不会解决内存重叠的问题,正序拷贝,适用于任何类型)
void* MyMemcpy(void* dest,const void* src,size_t num)
{
char* dest_tmp=(char*)dest;//目标字符串
const char* src_tmp=(const char*)src;//源字符串
assert(dest&&src);
while(num--)
{
*dest_tmp++= *src_tmp++;
}
return dest;
}
memmove:
//模拟实现memove(会解决内存重叠的问题,加上了逆序拷贝,适用于任何类型)
void* MyMemmove(void* dest,const void* src,size_t num)
{
char* dest_tmp=(char*)dest;
const char* src_tmp=(const char*)src;
assert(dest&&src);
if (src_tmp>dest_tmp || src_tmp+num<=dest_tmp)//情况2和情况1
{
while(num--)//正序复制
{
*dest_tmp++=*src_tmp++;
}
}
else//情况3,逆序赋值
{
//调整指针到最后
dest_tmp+=num-;
src_tmp+=num-;
while(num--)
{
*dest_tmp--=*src_tmp--;
}
}
return dest;
}
转自:memmove和memcpy函数的区别及实现
memmove和memcpy函数的区别及实现的更多相关文章
- 一些关于memcpy memmove函数的区别,和模拟实现
memcpy: 它是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 函数原型:void* memcp ...
- memmove 和 memcpy的区别
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void * ...
- C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码
extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h> 功能:由src所指内存 ...
- memmove 和 memcpy的区别以及处理内存重叠问题
区别: memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const v ...
- C/C++ memmove与memcpy的区别及实现
1.与字符串函数strcpy区别: memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作. memcpy与memmove拷贝多少是通过其第三个参数进行控制 ...
- sprintf、strcpy 及 memcpy 函数区别
这些函数的区别在于 实现功能 以及 操作对象 不同.strcpy 函数操作的对象是 字符串 ,完成 从 源字符串 到 目的字符串 的 拷贝 功能. sprintf 函数操作的对象 不限于字符串 :虽然 ...
- strcpy函数;memcpy函数;memmove函数
strcpy函数实现: char* strcpy(char* des,const char* source) { char* r=des; assert((des != NULL) && ...
- 内存操作函数memmove,memcpy,memset
通过字符串的学习,我们知道字符串操作函数的操作对象是字符串,并且它的结束标志是结束符\0,当然这个说的是不 受限制的字符串函数.然而当我们想要将一段内存的数据复制到另一块内存时,我们不能使用字符串操作 ...
- C语言memcpy()函数和memmove()函数
C语言memcpy()函数和memmove()函数 关于 memcpy() 函数,请先看链接. memcpy() 函数和 memmove() 函数的函数原型如下: void* memcpy(void ...
随机推荐
- LeetCode算法题-链表类
1.将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. (可以参照第2的merge2List实现) 示例: 输入:1->2->4, 1->3 ...
- LOJ2719. 「NOI2018」冒泡排序 [组合计数]
LOJ 思路 这题我看着题解还搞了几个小时?我也不知道自己在干啥-- 首先你要通过出色的分析能力得到一个结论:一个排列合法当且仅当它的最长下降子序列长度不超过2. 证明?懒得写了. 然后我们不管字典序 ...
- 建立自己的键盘栈(shortcutkeyStack)
建立自己的键盘栈(shortcutkeyStack) 作为一名开发者, 快捷键是必不可少的, 并且各种开发工具都有提供快捷键. 但是各种工具(IDE,编辑器)因为历史或者其他不可抗原因(比如键盘的布局 ...
- pve 导入 ova
匆忙记录 Proxmox includes qm importdisk as command. Extract your ova: tar -xvf *.ova Create a new VM wit ...
- mac 安装cmake
下载:https://cmake.org/download/ 下载完成后,双击安装 安装完成后,打开命令行,运行 bogon:~ macname$ sudo "/Applications/C ...
- 2018-2019-2 《网络对抗技术》Exp7 网络欺诈防范 20165326
网络欺诈防范 实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术, ...
- 咏南跨平台中间件支持LINUX和WINDOWS插件架构
咏南跨平台中间件支持LINUX和WINDOWS插件架构
- c#传不确定的参数个数,比如int型
a(params int[] ) 调用时a(1,2,3,4,5,6)
- 数据缺失值的处理 | R包 - mice
有些情况下缺失值会零星的分布在数据当中,这时去掉所有包含缺失值的样本就不行了,直接用0去填补缺失值也不行. 所以此时就应该用拟合的方法来填补缺失值. library(mice) init = mice ...
- Spring Boot核心原理
Spring Boot核心原理 spring-boot-starter-xxx 方便开发和配置 1.没有depoy setup tomcat 2.xml文件里面的没有没有了 @SpringBootA ...