目錄
1.memcpy函數
1.1?模擬實現
2.memmove函數
3.memcmp函數
1.memcpy函數
字符串拷貝strcpy和strncpy是有一定局限性的,只能拷貝字符串,而memcpy可以拷貝任意類型的數據,單位是字節。
1.1?模擬實現
#include<stdio.h>
#include<assert.h>
// 返回目標空間的的首地址
void* my_memcpy(void* des,void* src,size_t num)
{assert(des && src);void* ret = des;while (num--){*((char*)des) = *((char*)src);((char*)des)++;((char*)src)++;}return ret;
}int main()
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7 };int arr2[20] = { 0 };my_memcpy(arr2, arr1, sizeof(arr1));return 0;
}
?
2.memmove函數
? ? ? ? 我們發現:自己實現的memcpy不能實現自己拷貝自己,這是因為在逐字節拷貝的時候,后面的元素再去拷貝前面的字節,前面的字節已經被改過了;但是庫函數是可以自己拷貝自己的。
? ? ? ? memmove能夠實現自己拷貝自己
2.1 模擬實現
情況1:dest < src,此時應該從前向后拷貝,這樣就會避免,拷貝修改之后的值。
情況2:當des > src,此時從后往前拷貝。
?
總體區域劃分:
?
方案①:1、3區域從前往后拷貝;2區域從后往前拷貝;?
方案②:1區域從前向后(dest > src);23區域從后往前拷貝(dest < src);
這里采用方案②,只需要判斷dest 和 src的大小即可。
#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* dest, void* src, size_t num)
{assert(dest && src);void* ret = dest;if (dest < src){while (num--){// 從前向后拷貝*((char*)dest) = *((char*)src);((char*)dest)++;((char*)src)++;}}else{while (num--){// 從后向前拷貝,最后一個->倒數第二個*((char*)dest + num) = *((char*)src + num);}}return ret;
}int main()
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7 ,8,9,10 };int arr2[20] = { 0 };//my_memcpy(arr2, arr1, sizeof(arr1));my_memmove(arr1, arr1 + 3, 12);int i = 0;for(i = 0;i < 10;i++){printf("%d\n", arr1[i]);}return 0;
}
3.memcmp函數
?
第一個數組的內存中的數據比第二個內存中的數據要大。?
4.memset函數
使用來初始化內存的,第一個參數是起始地址,第二個參數是初始化的值,第三個是初始化的字節個數。
需要注意的是,這里的初始化是按照字節初始化的,所以盡量給一個字節類型的數據。