前言
本篇博客就来介绍下关于C语言常用的内存函数之memmove()函数。
🎉memmove() - 内存拷贝可重叠🎊
memmove()指定头文件是:#include<string.h>
实际上memmove()函数和memcpy()函数的用法是一样的,但是既然是不同的函数还是具有不同之处的:↓
- memmove()函数是可以处理内存重叠的情况的。
- memcpy()函数应该可以拷贝的是不重叠内存的情况的。
- 在这里重叠的意思实际上就是数组名相同的。
memmove() 函数的声明方式如下 👇
void *memmove(void *str1, const void *str2, size_t n)
在这里我们可以发现是和memcpy()是一样的。
参数讲解:↓
- str1 → 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- str2 → 指向要复制的数据源,类型强制转换为 void* 指针。
- n → 要被复制的字节数。
返回值→该函数返回一个指向目标存储区 str1 的指针。
🎉memmove()代码示例🎊
用同一个数组名进行内存拷贝。
示例代码如下 ↓
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main(void)
{
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
memmove(arr1+2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", *(arr1 + i));
}
}
运行结果 ↓
1 2 1 2 3 4 5 8 9 10
🔥注意:在这里如果你用memcpy()函数的话是不可以的。其实这个就是memcpy()函数和memmove()函数的区别所在了。
🎉创建自定义函数实现memmove()🎊
示例代码如下 👇
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
void *my_memmove(void *str1, const void *str2, size_t n)
{
void *ret = str1;
assert(str1 && str2 != NULL);
if (str1 < str2)
{
//前向后,小于。
while (n--)
{
*(char*)str1 = *(char*)str2;
str1 = (char*)str1 + 1;
str2 = (char*)str2 + 1;
}
}
else
{
//后向前,大于。
while (n--)
{
*((char*)str1 + n) = *((char*)str2 + n);
}
}
return ret;
}
int main(void)
{
int i = 0;
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 1 2 1 2 3 4 5 8 9 10
my_memmove(arr1+2, arr1, 20);
return 0;
}
先来看看 str1 > str2 的调试结果↓
再来看看 str2 < str1 的调试结果↓ 把上述代码的这段修改下即可。
my_memmove(arr1, arr1+2, 20);
不知道你学会了没有👀建议没有学会反复观看✨