Memcopy和memmove函數在linux下看了一下兩個函數的源碼。
兩個函數都在頭文件string.h中定義,函數原型為:
void * __cdecl memcpy ( void * dst,const void * src,size_t count); void * __cdecl memmove ( void * dst,const void * src,size_t count);
實現代碼如下:
void * __cdecl memcpy ( void * dst,const void * src,size_t count) { void * ret = dst; while (count--) { // 注意, memcpy函數沒有處理dst和src區域是否重疊的問題 *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } return(ret); } void * __cdecl memmove ( void * dst,const void * src,size_t count) { void * ret = dst; if (dst <= src || (char *)dst >= ((char *)src + count)) { // 若dst和src區域沒有重疊,則從起始處開始逐一拷貝 while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } } else { // 若dst和src 區域交叉,則從尾部開始向起始位置拷貝,這樣可以避免數據沖突 dst = (char *)dst + count - 1; src = (char *)src + count - 1; while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return(ret); }
總結一下:
當src和dst區域沒有重疊時,兩個函數是完全一樣的。木有重疊的條件是: dst <= src || (char *)dst >= ((char *)src + count 。否則,memcpy是不能正常工作的,memmove是可以正常工作的。