void * memmove ( void * destination, const void * source, size_t num );
它的功能就是:
将字节数的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样,允许目标和源重叠。
源指针和目标指针指向的对象的基础类型与此函数无关;结果是数据的二进制副本。
该函数不检查源中的任何终止空字符 - 它总是准确地复制字节数。
为避免溢出,目标参数和源参数指向的数组的大小应至少为字节数。
简洁的大白话就是:移动内存块!!!
void * memmove ( void * destination, const void * source, size_t num );
根据它的结构代码,可以分析出:
1.首先,它是针对内存块的,它需要返回内存,所以是void类型,又因为内存里存放的数据类型可以有很多不同种的,所以就用void来接收,后面再针对不同的类型进行强制类型转换。
2.其次,就是它的前两个所接受的数据类型,都是内存块,所以都指针,由于数据多样化需要用void*来接收,它的第三个接收的数据是需要移动的内存的大小,单位是字节,所以用size_t来接收
#include
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr, arr + 2, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
其作用:拷贝不重叠的内存块
2.memmove函数
• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
分析模拟memmove函数
分类讨论
1.dest的地址小于src的地址
2.dest的地址和src的地址重叠
3.dest的地址大于src的地址
//模拟实现memmove函数
#include
#include
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);//防止空指针
//从前向后
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 arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr, arr + 2, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//模拟实现memmove函数
#include
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
//从后向前
if (dest>=src&&dest<=(char*)src+num)
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
//从前向后
else
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return ret;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr, arr + 2, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}