【C语言】memmove() 内存拷贝可重叠

时间:2023-02-01 15:03:21
前言

本篇博客就来介绍下关于C语言常用的内存函数之memmove()函数。

 ????memmove() - 内存拷贝可重叠????

memmove()指定头文件是:#include<string.h>

实际上memmove()函数和memcpy()函数的用法是一样的,但是既然是不同的函数还是具有不同之处的:↓

  • memmove()函数是可以处理内存重叠的情况的。
  • memcpy()函数应该可以拷贝的是不重叠内存的情况的。
  • 在这里重叠的意思实际上就是数组名相同的。

memmove() 函数的声明方式如下 ????  

void *memmove(void *str1, const void *str2, size_t n)

【C语言】memmove() 内存拷贝可重叠

 在这里我们可以发现是和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));
}
}

【C语言】memmove() 内存拷贝可重叠

运行结果 ↓

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;
}

【C语言】memmove() 内存拷贝可重叠

先来看看 str1 > str2 的调试结果↓ 

【C语言】memmove() 内存拷贝可重叠

【C语言】memmove() 内存拷贝可重叠编辑

再来看看 str2 < str1 的调试结果↓ 把上述代码的这段修改下即可。 

my_memmove(arr1, arr1+2, 20);

【C语言】memmove() 内存拷贝可重叠

【C语言】memmove() 内存拷贝可重叠

不知道你学会了没有????建议没有学会反复观看✨