1.分情况讨论在 mommove 的时候会出现 2种情况 。1dest src这种情况为了不覆盖掉 src 的数据应该考虑选择从后往前move数据。2dest src:同样地为了不覆盖 src 的数据应考虑选择从前向后 move 数据。2.函数设计1在移动内存数据时因为不知道内存里存放的数据类型所以 dest 和 src 应该是 泛型指针即 void* 。2在 move数据时src的数据是不需要修改前置 const 让数据更安全。3同时因为未知的数据类型用一个字节一个字节地移动是合适的。4返回类型参照库函数 mommove 的返回类型是 void* ,既然是模拟实现和库函数的返回类型保持一致 void*。(5) 写出dest src 和 dest src不同情况的代码处理。3.代码实现//memmove的模拟实现 void* my_memmove(void* dest, const void* src, size_t num) { //判断指针是否是NULL assert(dest src); void* ret dest; if (dest src) { //从前向后移动数据 while (num--) { *(char*)dest *(char*)src; dest (char*)dest 1; src (char*)src 1; } } else { //从后向前移动数据 while (num--) { *((char*)dest num) *((char*)src num); } } return ret; } int main() { int arr1[] { 1,2,3,4,5,6,7,8,9 }; my_memmove(arr1 2, arr1, 20); int i 0; for (i 0; i 9; i) { printf(%d , arr1[i]); } return 0; }
C语言 mommove的模拟实现
发布时间:2026/7/4 22:04:42
1.分情况讨论在 mommove 的时候会出现 2种情况 。1dest src这种情况为了不覆盖掉 src 的数据应该考虑选择从后往前move数据。2dest src:同样地为了不覆盖 src 的数据应考虑选择从前向后 move 数据。2.函数设计1在移动内存数据时因为不知道内存里存放的数据类型所以 dest 和 src 应该是 泛型指针即 void* 。2在 move数据时src的数据是不需要修改前置 const 让数据更安全。3同时因为未知的数据类型用一个字节一个字节地移动是合适的。4返回类型参照库函数 mommove 的返回类型是 void* ,既然是模拟实现和库函数的返回类型保持一致 void*。(5) 写出dest src 和 dest src不同情况的代码处理。3.代码实现//memmove的模拟实现 void* my_memmove(void* dest, const void* src, size_t num) { //判断指针是否是NULL assert(dest src); void* ret dest; if (dest src) { //从前向后移动数据 while (num--) { *(char*)dest *(char*)src; dest (char*)dest 1; src (char*)src 1; } } else { //从后向前移动数据 while (num--) { *((char*)dest num) *((char*)src num); } } return ret; } int main() { int arr1[] { 1,2,3,4,5,6,7,8,9 }; my_memmove(arr1 2, arr1, 20); int i 0; for (i 0; i 9; i) { printf(%d , arr1[i]); } return 0; }