一些关于memcpy memmove函数的区别,和模拟实现
memcpy
它是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
函数原型:void* memcpy(void * dest, const void * src,size_t count)
#include<stdio.h
#include<assert.h>
void * memcpy (void * dst, const void * src, size_t count) {
assert(dst);
assert(src);
void * ret = dst;
char* pdst=(char*)dst;
char* psrc=(char*)src;
while (count--) {
*pdst++ = *psrc++;
}
return ret;
}
int main(){
char str[] = "abcdefg";
//char str0[] = "abcdefg";
char str1[1]="abcdg";
memcpy(str + , str, ); printf("以memcpy方式拷贝:%s\n", str + );
printf("期待的结果:%s\n", str1);
return ;
}

如上,发现dst和src所指向的区域是有重叠的,这里其实就是吧str数组中前4个字符的“abcd”拷贝到str数组后“cdefg”字符中,
当赋值到第3个元素时发现 原来的‘c’,已被覆盖了,同理‘d’也是 最后导致成了“ababg”这样的结果。
注意: source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。
memmove
该函数函数返回的是指向destin的指针,实现基本和memcpy类似。在处理区域重叠部分,它的原理是这样:
假设要把一字符数组src中的“ABCDEFG”赋值给字符数组dst中,它们都有重叠区域,那么就
分
和
这两种情况来处理。
接下来实现memmove :
#include<stdio.h>
#include<assert.h>
void * memmove ( void * dst, const void * src, size_t count) { //将src内容拷贝count个字节到dst中,若拷贝过程中
assert(dst); //它们有重叠区域 ,用以上两种方式分别进行拷贝。规避了memcpy的缺陷 assert(src);
void * ret = dst;
char* pdst=(char*)dst;
const char* psrc=(const char*)src;
if (pdst > psrc && pdst < (psrc + count)) { //从后往前拷贝
while (count--) {
*(pdst+count )= *(psrc+count);
}
}
else {
while(count--){
*pdst++=*psrc++;
}
}
return ret;
}
int main(){
char str[] = "abcdefg";
char str1[] = "abcdg";
memmove(str + , str, );
printf("以memmove方式拷贝:\n");
printf("内存覆盖情况下:%s\n", str + );
printf("期待情况:%s\n", str1);
return ;
}
以此,就可以在解决memcpy函数的缺陷了。
一些关于memcpy memmove函数的区别,和模拟实现的更多相关文章
- strcpy和memcpy,memmove函数的区别
strcpy和memcpy的区别 strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制 ...
- memmove和memcpy函数的区别及实现
一.memmove()和memcpy()函数和strcpy()函数的区别: (1)使用的类型不同,strcpy()函数只对字符串进行操作:memmove()和memcpy()函数对所有类型都适用,为内 ...
- 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset
我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && ...
- C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码
extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h> 功能:由src所指内存 ...
- strcpy函数;memcpy函数;memmove函数
strcpy函数实现: char* strcpy(char* des,const char* source) { char* r=des; assert((des != NULL) && ...
- C语言memcpy()函数和memmove()函数
C语言memcpy()函数和memmove()函数 关于 memcpy() 函数,请先看链接. memcpy() 函数和 memmove() 函数的函数原型如下: void* memcpy(void ...
- memmove函数
写一个函数,完成内存之间的拷贝 void* mymemcpy( void *dest, const void *src, size_t count ) { char* pdest = static_c ...
- memcpy的函数
网新恒天2014校园招聘笔试编程题 已知memcpy的函数为: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针 ...
- 自己实现的库函数2(memset,memcmp,memcpy,memmove)
memset,memcmp,memcpy,memmove是对内存进行管理的库函数,为了更好的理解和使用这几个函数,自己用C语言实现一下~ //内存设置函数void* my_memset(void* d ...
随机推荐
- SDUTOJ 贪心 -商人小鑫
题目描写叙述 小鑫是个商人,当然商人最希望的就是多赚钱.小鑫也一样. 这天,他来到了一个遥远的国度.那里有着n件商品,对于第i件商品须要付出ci的价钱才干得到. 当然.对于第i件商品,小鑫在自己心中有 ...
- springboot + @scheduled 多任务并发
一.问题 项目采用springboot搭建,想给方法添加@Scheduled注解,实现两个定时任务.可是运行发现,两个task并没有并发执行,而是执行完一个task才会执行另外一个.上代码: pack ...
- Python笔记·第四章—— 细数Python中的数据类型以及他们的方法
一.数据类型的种类及主要功能 1.数字类型 数字类型主要是用来计算,它分为整数类型int和浮点类型float 2.布尔类型 布尔类型主要是用于判断,它分为真True和False两种 3.字符串类型 字 ...
- 服务器固件测试--PCI设备的介绍(集成网卡和外插网卡)
今天2017年9月26号,快三个月的时间,是该梳理一下,我来到这个岗位学到的东西. 网卡是什么 网卡分为俩大类 板载的集成网卡和外插的网卡.外插的网卡又分为很多种. 板载的集成网卡 外插的网卡分为 I ...
- TextMesh Pro 超链接解析失败
前言 软件环境 Unity3D 5.3.7p4 TextMesh Pro 1.0.555.0b11(Jul 06.2017) UGUI做为UI解决方案 文档资料 TextMesh Pro的资料,可以参 ...
- (转)spring aop
工作忙,时间紧,不过事情再多,学习是必须的.记得以前的部门老大说过:“开发人员不可能一天到晚只有工作,肯定是需要自我学习.第一:为了更充实自己,保持进步状态.第二:为了提升技术,提高开发能力.第三:保 ...
- 自学Zabbix3.8.1.1-可视化Visualisation-Graphs简单图表
自学Zabbix3.8.1.1-可视化Visualisation-Graphs简单图表 Zabbix提供了一些简单的图表,用于可视化由项目收集的数据. 用户不需要进行配置工作来查看简单的图表.他们是由 ...
- 如何通过Mock API提高APP开发效率?
APP开发过程中,如果可以在客户端的正常项目代码中,自然地(不影响最终apk)添加一种模拟服务器数据返回的功能,这样就可以很方便的在不依赖服务器的情况下展开客户端的开发. Mock API提供了这一问 ...
- Confluence 持续集成平台部署记录
1.1 Confluence简介 Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki.使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息.文档协作.集体 ...
- 【HTML5】增强的表单
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...