1 void *my_memcpy_byte(void *dst, const void *src, int n) 2 { 3 if (dst == NULL || src == NULL || n <= 0) 4 return NULL; 5 6 char * pdst = (char *)dst; 7 char * psrc = (char *)src; 8 9 if (pdst > psrc && pdst < psrc + n) 10 { 11 pdst = pdst + n - 1; 12 psrc = psrc + n - 1; 13 while (n--) 14 *pdst-- = *psrc--; 15 } 16 else 17 { 18 while (n--) 19 *pdst++ = *psrc++; 20 } 21 return dst; 22 }
在上面按字节拷贝中考虑了拷贝覆盖,连续的一段空间存放数据是从低地址到高地址进行存放。先从源地址读出数据,然后写入到目的地址空间中。目的空间的起始地址如果在源数据空间之内就会出现内存覆盖的情况。
这种情况先从尾部拷贝,避免覆盖数据,不过这种情况也会破坏src空间数据,在src前使用了const关键字,也就是空间只读,在函数内部不修改src空间数据。
而标准库的memcpy并没有将写覆盖认为是内存拷贝,而是内存移动。memcpy的src代表一块内存空间,并用const关键字修饰,并不希望内存块被破坏。
对于写覆盖(这里是内存块移动)标准库推荐使用memmove函数。
原文:https://www.cnblogs.com/liangyc/p/11628723.html