C中自己的memcpy
C语言:#include<string.h> 库中的 memcpy
函数原型 void *memcpy(void*dest, const void *src, size_t n); 功能 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。 头文件 #include<string.h> 返回值 函数返回一个指向dest的指针。 说明 1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。 2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。 3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。 //注意,source和destin都不一定是数组,任意的可读写的空间均可 ———————————————— 原文链接:https://blog.csdn.net/tigerjibo/article/details/6841531
自己的memory_copy
memory_cpy // 版本 1 不考虑重叠 void *memcpy(void *dest, const void *src, size_t count) { char *tmp = dest; const char *s = src; while (count--) *tmp++ = *s++ ; // 先取出s的内容,后s+1 return dest; } //版本 2 考虑重叠 void *memcpy(void *dest, const void *src, size_t count) { char *d; const char *s; if (dest > (src+size)) || (dest < src)) { d = dest; s = src; while (count--) *d++ = *s++; } else /* overlap 重叠情况从高位到低位复制*/ { d = (char *)(dest + count - 1); /* offset of pointer is from 0 */ s = (char *)(src + count -1); while (count --) *d-- = *s--; } return dest; }
考虑重叠
void* MemoryCopy(void *dest, const void *src, size_t size) { assert(dest != NULL); assert(src != NULL); if (src == dest) return dest; char *d; const char *s; if ((src > dest) || (src <= (char*)dest - size)) { d = (char*)dest; s = (const char*)src; while (size--) *d++ = *s++; } else /* overlap 重叠情况从高位到低位复制 */ { d = (char*)dest + size - 1; s = (const char*)src + size - 1; while (size--) *d-- = *s--; } return dest; }
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。