函數原型: 頭文件: 引入: 字元串由'\0'結尾,所以字元串內部不能包含任何'\0'字元('\0'的ASCII值為0),否則我們將讀不到'\0'後的字元內容。但是,非字元串內部包含零值的情況並不罕見,我們無法利於其它字元串函數來處理這類數據。所以,我們要引入記憶體操作的函數來處理。 memcpy m ...
函數原型:
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
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
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 { //記憶體不重疊,相當於memcpy while (count--) { *dest++ = *str++; } } return dst; }