內存函數
- 一、memcpy使用和模擬實現
- 1.1參數
- 1.2 使用
- 1.3 模擬實現
- 二、memmove使用和模擬實現
- 2.1 參數
- 2.2 使用
- 2.3 模擬實現
- 三、memset使用
- 3.1 參數
- 3.2 使用
- 四、memcmp使用
- 4.1 參數
- 4.2 使用
一、memcpy使用和模擬實現
1.1參數
- 因為內存中不知道存的是什么類型的地址,所以函數的參數以及返回值都是void類型。
- 第一個參數是要拷貝到哪;第二個參數是從哪里拷貝;第三個參數是要拷貝的數據長度。
- 該函數不會檢查是否有終止字符‘\0’,它會準確地復制num長度的數據。
- 為了避免溢出,destination和source的長度應至少為num。
- destination和source不能有重疊。
1.2 使用
1.3 模擬實現
void my_memcpy(void* arr2, void* arr1, size_t num)
{while (num--){*(char*)arr2 = *(char*)arr1;((char*)arr2)++;((char*)arr1)++;}
}int main()
{int arr1[] = { 1,2,3,4,5,6 };int arr2[2];my_memcpy(arr2, arr1, 8);int i = 0;for (i = 0;i < 2;i++){printf("%d ", arr2[i]);}return 0;
}
在模擬實現時,重點是對數據的拷貝,因為內存中存放的數據不知道其類型,因此我們把數據分成最小的單元也就是1個字節,對應char類型數據,因此將void類型強制轉換成char類型的數據,然后通過while循環,遍歷num個字節長度的數據,實現一定量數據的拷貝。
二、memmove使用和模擬實現
2.1 參數
- 注意:memmove和memcpy的區別就是,memmove所指向的兩塊空間可以有重疊。
2.2 使用
2.3 模擬實現
//展示其中一種特例
#include <assert.h>void my_memmove(void* arr2, void* arr1, size_t num)
{assert(arr1 && arr2);if (arr1 <= arr2){while (num--){*((char*)arr2 + num) = *((char*)arr1 + num);}}else{while (num--){*((char*)arr2) = *((char*)arr1);((char*)arr2)++;((char*)arr1)++;}}
}int main()
{int arr1[] = { 1,2,3,4,5,6 };my_memmove(arr1, arr1+1, 8);int i = 0;for (i = 0;i < 5;i++){printf("%d ", arr1[i]);}return 0;
}
}
- 注意:在進行memmove的模擬實現時,應考慮重疊的情況,例如對一個字符串進行調整時,可能會出現:source地址分別>、<、=destination地址的情況,因此需要分情況來討論。
三、memset使用
3.1 參數
- 參數一是一個指向所要修改的內存的地址;參數二是要修改成什么數值;參數三是修改幾個字節個長度的數據。
3.2 使用
四、memcmp使用
4.1 參數
- 參數一和參數二是要比較的兩個數據的地址;參數三是要比較的數據的長度。
- 內存1>內存2,打印一個大于0的數字;內存1<內存2,打印一個小于0的數字;內存1=內存2,打印0。
4.2 使用
比較的是12個字節,也就是前三個數字的大小,數組2的前三個數字比數組1前三個數字大,所以打印小于0的數字,-1。