您的位置:首页 > 其它

一些关于memcpy memmove函数的区别,和模拟实现

2017-11-22 00:19 369 查看

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[10]="abcdg";
memcpy(str + 2, str, 4);       printf("以memcpy方式拷贝:%s\n", str + 2);
printf("期待的结果:%s\n", str1);
return  0;
}






如上,发现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 + 2, str, 4);
printf("以memmove方式拷贝:\n");
printf("内存覆盖情况下:%s\n", str + 2);
printf("期待情况:%s\n", str1);
return 0;
}



以此,就可以在解决memcpy函数的缺陷了

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: