函數原型:
void* memcpy(void *dst,void const *src,size_t count) void* memmove(void *dst,void const *src,size_t count)
頭文件:
#include<string.h>
字符串由"\0"結尾,所以字符串內部不能包含任何'\0'字符('\0'的ASCII值爲0),否則我們將讀不到'\0'後的字符內容。但是,非字符串內部包含零值的情況並不罕見,我們無法利於字符串函數來處理這類數據。所以,我們要利用內存操作的函數來處理。
memcpy函數是從src的起始位置複製count個字節到dst內存的起始位置。我們可以利用這種方法複製任何類型的數值,但是,如果src和dst以任何形式出現了重疊,它的結果就是未定義的。所以,有內存重疊的情況時,我們要避免使用memcpy函數。
//模擬memcpy源碼實現 void* my_memcpy(void *dst, void *src, size_t count) { assert(dst); assert(src); char *dest = (char *)dst; char *str = (char *)src; while (count--) { *dest++ = *str++; } return dst; }
memmove函數和memcpy函數差不多,只是它的源和目標操作數可以重疊。
//模擬memmove源碼實現 void* my_memove(void *dst, void *src, size_t count) { assert(dst); assert(src); char *dest = (char *)dst; char *str = (char *)src; if ((dest > str) && (dest < str + count)) { dest = dest + count - 1; src = src + count - 1; while (count--) { *dest-- = *str--; } } else { while (count--) { *dest++ = *str++; } } return dst; }