一些关于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函数的缺陷了。
相关文章推荐
- 运用指针模拟实现一些代码以及memcpy函数与memmove函数的区别
- 一些字符串操作函数的模拟实现
- 模拟实现库string.h的一些函数
- 一些常用函数模拟实现
- 模拟实现memcpy、memmove函数以及二者的区别
- 关于宏和函数、内联函数的一些区别
- 一些常用函数模拟实现
- c#中关于字符串的一些函数
- 关于VR(主要是虚拟城市场景)的一些想法及实现(可能会连载)
- 关于Memory Pool的一些想法及实现
- 搜集的一些关于.NET模拟POST数据的资料
- 陆续一些常用函数汇编实现
- 关于函数调用中参数传递的一些思考
- java 中一些接口和实现类的区别
- c#中关于字符串的一些函数.txt
- 关于目录处理的一些函数
- 关于日期方面的一些方法和函数
- 使用" 参数化基类" 和" 成员函数指针" 模拟实现虚函数--在实际中的应用
- 关于Oracle中split函数的实现以及函数递归的举例。
- 关于 SkyEye硬件模拟平台 的一些资料汇总