【C语言】memmove-拷贝重叠内存块

从源头指向的内存块拷贝固定字节数的数据到目标指向的内存块,并且源头的内存块与目标内存块可以重叠.(最后一点是memmove()与memcpy最大的区别)
函数参数
该函数一共有三个参数,分别是:
void * memmove ( void * destination, const void * source, size_t num );
1>.void * destination
第一个参数的类型是无类型指针(void*),它指向拷贝的目的地内存块,它的作用是为函数提供目的地的内存块起始地址,以便函数能够准确地将内容拷贝到我们需要的内存空间.
2>.onst void * source
第二个参数的类型是被const修饰(const修饰的指针,const在*左边表示指针指向的内容不可修改,const在*右边表示指针的指向不可修改)的无类型指针(void*),它指向拷贝数据的来源内存块,它的作用是为函数提供拷贝源头内存块起始地址,以便函数能够准确找到拷贝的源头进行拷贝.
3>.size_t num
第三个参数的类型是size_t(无符号整形),它表示要拷贝数据的字节数,它的作用是告诉函数需要拷贝的字节数是多少,以便函数精准的拷贝该数目字节数空间的内容到目的地.
二.memmove()函数的具体使用
memmove()函数的使用场景是:
当我们想拷贝一个整型数组/结构体/枚举常量等strcpy()函数无法拷贝的数据,并且目的地内存块和源头内存块可能会有重叠的时候,我们可以考虑使用memmove()函数来完实现这一诉求,当然,想要使用memmove()函数拷贝字符串数据或者拷贝目的地内存块和源头内存块不重叠也是可以的.(但是会有些杀鸡用牛刀的感觉哈哈哈)
下面是拷贝时源内存块与目标内存块重叠的情况示意图:
测试代码
#include <iostream> int main() { std::cout << "Hello World!\n"; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; memmove(arr + 2, arr, sizeof(arr[0]) * 5); //arr + 2:指向数组第 2 个索引的位置,也就是 &arr[2],即值为 3 的位置 //arr:指向数组起始位置,即 &arr[0],值为 1 //sizeof(arr[0])计算的结果是arr数组中一个元素的字节大小,乘5代表五个 for (size_t i = 0; i < 10; i++) { std::cout << arr[i] << std::endl; } //结果:1 2 1 2 3 4 5 8 9 10 }


浙公网安备 33010602011771号