memcpy/memmove实现
对于memcpy(void *dest, const void *src, size_t count),其实现机制是将src强制转换为char *类型,然后拷贝src中的count个字节拷贝至dest中,跟strcpy不同的是,memcpy函数在末尾是不会加'\0'的。
memmove(void *dest, const void *src, size_t count)与memcpy的根本区别在于,memcpy是不会考虑内存重叠的问题的,因此,memmove比memcpy更安全。
代码如下:
View Code
#include<iostream> using namespace std; //不考虑内存重叠,参考crt实现 /* void *_memcpy(void *dest, const void *src, size_t count) { void *pAddress = dest; if((dest == NULL) || (src == NULL) || (count < 0)) return 0; while(count--) { *(char *)dest = *(char *)src; dest = (char *)dest+1; src = (char *)src+1; } return pAddress; } */ void *_memcpy(void *dest, const void *src, size_t count) { void *pAddress = dest; const char *pSrc = static_cast<const char *>(src); char *pDest = static_cast<char *>(dest); if((dest == NULL) || (src == NULL) || (count < 0)) return 0; while(count--) { *pDest++ = *pSrc++; } return pAddress; } //考虑内存重叠 void *_memmove(void *dest, const void *src, size_t count) { void *pAddress = dest; const char *pSrc = static_cast<const char *>(src); char *pDest = static_cast<char *>(dest); //从后往前复制,避免重叠部分在复制之前被覆盖 //保证重叠区域在被覆盖之前复制到目的区域中 //与大端小端无关 if(pDest >= pSrc || pDest <= pSrc+count-1) { pDest += count-1; pSrc += count-1; while(count--) { *pDest-- = *pSrc--; } } else { while(count--) { *pDest++ = *pSrc++; } } return pAddress; } int main() { char arr1[] = "12345"; char arr2[20] = "abcdefghij"; //int arr_1 = 1234; //int arr_2 = 4321; //_memcpy(&arr1, &arr2, 4); _memmove(arr2+2, arr2, 3); cout<<arr2<<endl; return 0; }