memmove函数的功能介绍及模拟实现✍️
1.memmove函数的功能介绍🧐
1.1函数结构🕵️
void * memmove ( void * destination, const void * source, size_t num );
1.2 功能介绍🤯
根据cplusplus网站上对memmove函数的介绍:
它的功能就是:
将字节数的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样,允许目标和源重叠。
源指针和目标指针指向的对象的基础类型与此函数无关;结果是数据的二进制副本。
该函数不检查源中的任何终止空字符 - 它总是准确地复制字节数。
为避免溢出,目标参数和源参数指向的数组的大小应至少为字节数。
简洁的大白话就是:移动内存块🤯🤯🤯!!!
函数结构分析🕵️
void * memmove ( void * destination, const void * source, size_t num );
根据它的结构代码,可以分析出:
1.首先,它是针对内存块的,它需要返回内存,所以是void类型,又因为内存里存放的数据类型可以有很多不同种的,所以就用void来接收,后面再针对不同的类型进行强制类型转换。
2.其次,就是它的前两个所接受的数据类型,都是内存块,所以都指针,由于数据多样化需要用void*来接收,它的第三个接收的数据是需要移动的内存的大小,单位是字节,所以用size_t来接收
2.memmove函数应用💻
2.1代码实现✍️
#include<stdio.h>
#include<string,h>
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.2运行结果展示💻
3.memmove函数与memcpy函数的对比🧐
3.1根据cplusplus网站介绍💻
1.memcpy函数
其作用:拷贝不重叠的内存块
2.memmove函数
• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
4.memmove函数的模拟实现✍️
4.1模拟图解分析🧠
分析模拟memmove函数
分类讨论
1.dest的地址小于src的地址
2.dest的地址和src的地址重叠
3.dest的地址大于src的地址
**1.**三种分类
**2.**两种移动方法
**3.**两种方法的代码简化实现
4.2代码实现✍️
4.2.1 方法1✍️
//模拟实现memmove函数
#include<stdio.h>
#include<assert.h>
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;
}
4.2.2 方法2✍️
//模拟实现memmove函数
#include<assert.h>
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;
}