目录
一、memcpy
功能:将source中的数据复制到destination中,复制num个字节(byte)。一般用于不重叠内存的拷贝。
举例:图中为将arr2中5个数据拷贝到arr1中 ,20个字节即5个整型。
模拟实现memcpy函数:
#include<stdio.h> #include<string.h> #include<assert.h> void *my_memcpy(void* dest, const void* src, size_t num) { void* ret=dest; assert(dest && src); while (num--) { *(char*)dest = *(char*)src; src = (char*)src + 1;//(char*)src++ 写法错误 dest = (char*)dest + 1;//强制类型转换是临时的 当++时已经没有意义了 } return ret; } int main() { int arr1[10] = { 0 }; int arr2[] = { 1,2,3,4,5 }; my_memcpy(arr1, arr2, 20); for (int i = 0; i < 10; i++) { printf("%d ", arr1[i]); } return 0; }
运行结果:
二、memmove
功能:将source中的数据拷贝到destination中,拷贝num个字节(byte)。一般用于重叠内存的拷贝。
举例:将1,2,3,4,5拷贝到3,4,5,6,7的位置。
模拟实现memmove函数:
#include<stdio.h> #include<string.h> #include<assert.h> void *my_memmove(void* dest, const void* src, size_t num) { assert(dest && src); void* ret = dest; if(dest<src) { //从前->后拷贝 int i = 0; for (i = 0; i < num; i++) { *(char*)dest = *(char*)src; src = (char*)src + 1; dest = (char*)dest + 1; } } else { //从后->前拷贝 while (num--) { *((char*)dest + num) = *((char*)src + num);//num进循环后是19 } } return ret; } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; my_memmove(arr, arr+2, 20); for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; }
运行结果:
三、memset
功能:memset是设置内存的,是以字节设置内存的。把ptr中num字节的数据设置为自己设定的value值。
举例:从'w'开始,设置上4个字节的数据为‘x’。
注意:memset是以字节为单位设置的,会将每个字节都设为1,而不是将arr数值中10个数设为1。
四、memcmp
功能:按字节比较两个ptr1和ptr2
当ptr1<ptr2时返回一个<0的数
当ptr1=ptr2时返回0
当ptr1>ptr2返回一个>0的数
举例: