1. memcpy 使用和模擬實現
void* memcpy(void* destination,const void* source,size_t num);
- 函數memcpy從source的位置開始向后復制num個字節的數據到destination指向的內存位置。
- 這個函數在遇到 ‘\0’ 的時候并不會停下來
- 如果source和destination有任何的重疊,復制的結果都是未定義的。
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <assert.h>void* my_memcpy(void* arr2, const void* arr1, size_t num)
{int i = 0;assert(arr2 && arr2);void* ret = arr2;for (i = 0; i < num; i++){*(char*)arr2 = *(char*)arr1;arr2 = (char*)arr2 + 1;arr1 = (char*)arr1 + 1;}return arr2;
}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };//將arr1中的3 4 5 6 7 拷貝放到arr2中my_memcpy(arr2, arr1 + 2, 20);return 0;
}
2.memmove函數和模擬實現
void* memmove(void* destination,const void* source,size_t num);
相比于memcpy,memmove函數就是直接移動,應用面更加廣。
模擬實現部分:
#include <stdio.h>
#include <assert.h>
#include <string.h>void* my_memmove(void* arr2, const void* arr1, size_t num)
{int i = 0;assert(arr2 && arr2);char* ret = arr2;if (arr2 < arr1)//從前向后{while (num--){*(char*)arr2 = *(char*)arr1;arr2 = (char*)arr2 + 1;arr1 = (char*)arr1 + 1;}}else//從后到前{ while (num--){*((char*)arr2 + num) = *((char*)arr1 + num);}}return ret;
}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };//將arr1中的3 4 5 6 7 拷貝放到arr2中my_memmove(arr1 + 2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
3. memset 函數的使用
void* memset(void* ptr,int value,size_t num);
memset是用來設置內存的,將內存中的值以字節為單位設置成想要的內容。
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "hello world";memset(arr + 6, 'x', 5);printf("%s", arr);return 0;
}
輸出結果:hello xxxxx
但是:
并沒有出現前四個數組內容是1。原因在于“以字節為單位”。
四個1都賦值到arr【1】中,最后形成了一個非常大的數字。
4.memcmp 函數的使用
int memcmp(const void* ptr1,const void* ptr2,size_t num);
- 比較從ptr1和ptr2指針指向的位置開始,向后的num個字節。
#include <stdio.h>
#include <string.h>int main()
{int arr1[] = { 1,2,3,4,5 };//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 00 05 00 00 00 00int arr2[] = { 1,2,3,6,5 };//01 00 00 00 02 00 00 00 03 00 00 00 06 00 00 00 00 05 00 00 00 00memcmp(arr1, arr2, 12);//返回值為0memcmp(arr1, arr2, 12);//返回值為-1return 0;
}
作者自述:本文主要針對C語言的內存函數的知識。內容中包含了很多總結內容。本文制作不易,求求動動你們發財的小手點個贊和關注,這是對我創造最大的動力。后續我也會跟進內容,盡量一周至少一次,保證內容的質量。如果有想知道的內容或者有建議的地方,歡迎后臺私信或者在本文留言哦。感謝各位的支持捏Thanks?(・ω・)ノ。