memcpy
memmove
memcmp
memcpy
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
模拟实现
#include <stdio.h> void* my_memcpy(void* arr11, const void* arr2, int size_num) { void* ptr = arr11; while (size_num--) { *(char*)arr11 = *(char*)arr2; (char*)arr11=(char*)arr11+1; (char*)arr2=(char*)arr2+1; } return ptr; } int main() { int arr[] = { 1,2,3 }; int arr1[10] = { 0 }; my_memcpy(arr1, arr, sizeof(arr)); printf("%d", arr1[0]); return 0; }
memmove
void * memmove ( void * destination, const void * source, size_t num );
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
第一句话什么意思呢,我们来试一下两个函数
我们是想吧123放到234位置,可是结果跟我们不一样,那我们看看memmove
这就是两者区别
所以我们来模拟实现一下
void* my_memmove(void* dest, void* source, int size)//分两种情况,dest在source前,dest在source后 { void* ret = dest; if (source < dest) { while (size--)//要减掉1才能指向想要的最后一个元素 ,先拿size判断,判断完之后自减,执行下一步 { *((char*)dest + size) = *((char*)source+ size); } return ret; } if (source > dest) { while (size--) { *(char*)dest = *(char*)source; (char*)dest = (char*)dest + 1; (char*)source = (char*)source + 1; } return ret; } } int main() { int arr1[] = { 1,2,3,4,5,6,7,8}; my_memmove(arr1+2,arr1+1,16); return 0; }
memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
实现