1.描述
- void * memmove ( void * destination, const void * source, size_t num );
- 不限定具体指针类型,仅仅按字节拷贝,可能出现截断等问题。
- 优化memcpy了中的后目的重叠问题。
- 由于数组作为形参会退化,所以我们不能解决越界访问,以及空间不够的问题。
- 库函数没有安全检查,空指针,越界访问,以及空间不足会崩溃的问题。
- 返回值为指向目的首地址的指针。
- 源空间数据还是会被改变。
2.代码展示
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void* mymemmove(void* dst, void* src, size_t num)
{
assert(dst&&src);
unsigned char* pdst = (unsigned char*)dst;
unsigned char* psrc = (unsigned char*)src;
if (psrc < pdst&&pdst < psrc + num)
{
for (size_t i = num - 1; i >= 0; --i)
{
pdst[i] = psrc[i];
}
return pdst;
}
else
{
for (size_t i = 0; i < num; ++i)
{
pdst[i] = psrc[i];
}
return pdst;
}
}
void test7()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 6,7,8,9,10 };
int arr3[5] = { 1,2,3,4,5 };
void* ret3 = memmove(arr1, arr1 + 2,20 );
void* ret4 = mymemmove(arr3, arr3+2, 20);
printf("%p %p\n", arr1, ret3);
printf("%p %p\n", arr3, ret4);
for (int i = 0; i < sizeof(arr3) / sizeof(arr3[0]); ++i)
{
printf("%d", arr3[i]);
}
}
int main()
{
test7();
system("pause");
return 0;
}
3.结果展示
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3c74af980f79615a191401745ac07002.png)