memmove与memcpy相比,可以实现同一数组的赋值
memmove要点
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。
函数实现
void* my_memmove(void* dest, void* sor, size_t num) { void* ret = dest;//纪录dest的初始地址 //判断dest和sor的位置选这从前还是从后开始赋值 if (dest < sor) { for (int i = 0; i < num; i++) {//memmove是按内存大小赋值,强转成char*后赋值,以免遗漏 *(char*)dest = *(char*)sor; dest = (char*)dest + 1; sor = (char*)sor + 1; } } else { for (int i = num - 1; i >= 0; i--) { *((char*)dest+i )= *((char*)sor+i); } } return ret; }
样例比较
#include <stdio.h> #include <string.h> void* my_memcpy(void* dest, void* sor, size_t num) { void* ret = dest;//纪录dest的初始地址 for (int i = 0; i < num; i++) {//memcpy是按内存大小赋值,强转成char*后赋值,以免遗漏 *(char*)dest = *(char*)sor; dest = (char*)dest + 1; sor = (char*)sor + 1; } return ret; } void* my_memmove(void* dest, void* sor, size_t num) { void* ret = dest;//纪录dest的初始地址 //判断dest和sor的位置选这从前还是从后开始赋值 if (dest < sor) { for (int i = 0; i < num; i++) {//memmove是按内存大小赋值,强转成char*后赋值,以免遗漏 *(char*)dest = *(char*)sor; dest = (char*)dest + 1; sor = (char*)sor + 1; } } else { for (int i = num - 1; i >= 0; i--) { *((char*)dest+i )= *((char*)sor+i); } } return ret; } int main() { int a[] = { 1,2,3,4,5,6,7,8,9,10 }; int b[10] = { 0 }; my_memcpy(b, a, 40); my_memmove(a+2, a,16); my_memcpy(b+2, b, 16); cout << "使用memmove的自赋值:"; for (int i = 0; i < 10; i++) cout << a[i] << ' '; cout << "\n使用memcpy的自赋值:"; for (int i = 0; i < 10; i++) cout << b[i] << ' '; //小端存储,赋17字节的内存就能吧a[4]赋值到b[4] return 0; }
运行结果