一些关于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 ...
随机推荐
- POJ - 1611The Suspects-并查集
POJ - 1611 The Suspects Time Limit: 1000MS Memory Limit: 20000KB 64bit IO Format: %I64d & %I ...
- css实现垂直水平居中的5种方法
css实现垂直水平居中的5种方法 给父元素设置table-cell,text-align,vertical-align #big{ width: 200px; height: 200px; borde ...
- 基于.NET的弹性及瞬间错误处理库Polly
本文基本是官方说明的翻译和总结(https://github.com/App-vNext/Polly) 什么是Polly? Polly是一款基于.NET的弹性及瞬间错误处理库, 它允许开发人员以顺畅及 ...
- 机器学习 - pycharm, tensorflow集成篇
继续上篇的pyspark集成后,我们再来看看当今热的不得了的tensorflow是如何继承进pycharm环境的 参考: http://blog.csdn.net/include1224/articl ...
- 在IDEA中实战Git(转载自)
转载自:http://blog.csdn.net/autfish/article/details/52513465 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组 ...
- python安装和环境变量的配置
python安装和环境变量的配置 研究生阶段学习的需求,简单的学习了python的语法和基础之后产生了兴趣,有了想从基础把python学好用好的想法.因此在忙碌的学习中抽出时间,在每天花几个小时学习p ...
- iOS 用户密码 数字字母特殊符号设置 判断
//直接调用这个方法就行 -(int)checkIsHaveNumAndLetter:(NSString*)password{ //数字条件 NSRegularExpression *tNumRegu ...
- VMware的一些总结
一.虚拟主机联网的三种方式: 1.仅主机(Host Only),虚拟主机只能与宿主机联网通信,无法访问外网和宿主机所在局域网的其它主机. 2.桥接(Bridge),在桥接模式下,虚拟主机就像是宿主机所 ...
- c#创建access数据库和数据表
由于在程序中使用了ADOX,所以先要在解决方案中引用之,方法如下: 解决方案资源管理器(项目名称)-->(右键)添加引用-->COM--> Microsoft ADO Ext. ...
- hibernate 3.6.10 maven pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...