标签:des c style class blog code
memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,返回dest所指内存地址的起始位置。
输入abcedfghi,我们期望得到的结果是abcabcdef,但是输出的却是abcabcabc。
仔细分析下会发现是因为复制过程中abc覆盖了edf,等到本要用edf覆盖ghi时却用abc覆盖了ghi,因此得到了abcabcabc。
因此对于上面这种情况我们要倒着复制。但其实这样还是不够的。
对于str=abcdefghi内存重叠有两种情况。
1.str->str+3 ,n=6
重叠结果(从前往后拷)
abcabcabc
不重叠结果(从后往前拷) abcabcdef
2.str+3->str , n=6
重叠结果(从后往前拷)
ghighighi
不重叠结果(从前往后拷) defghighi
总结一下内存重叠的时候:
如果是前面的内存要复制到后面的内存,那么每次移动的时候应该倒序复制字节。
如果是后面的内存复制到前面的内存,那么每次移动的时候应该正序复制字节。
实现代码:
#include <string.h> #include <stdio.h> #include <stdlib.h> void* Memcpy(void *dst, const void *src, size_t size) { if((dst==NULL)||(src==NULL)) return NULL; char *pd,*ps;//为什么要定义char指针,因为char指针每次自加都是变化一个字节 if(dst>src&&(char*)dst<(char*)src+size) //保证是 str->str+3 这种情况,原串起点小于目标串起点且目标串起点小于原串终点 { pd=(char*)dst+size-1; ps=(char*)src+size-1; while(size--) *pd--=*ps--; } else { pd=(char*)dst; ps=(char*)src; while(size--) *pd++=*ps++; } return dst; } int main() { char str[100]; gets(str); Memcpy(str+3,str,6); puts(str); return 0; }
如有错误,欢迎指出。
参考http://baike.baidu.com/view/736225.htm?fr=aladdin
标签:des c style class blog code
原文地址:http://www.cnblogs.com/kkkwjx/p/3749690.html