按字節(Byte)拷貝實現的memcpy
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函數。