#C 语言标准库函数 memmove
/*********************************************
* @brief 复制内存数据
* @param dest 目标内存地址
* @param src 源内存地址
* @param count 要复制的字节数
* @return 目标地址
********************************************/
void* memmove(void* restrict dest, const void* restrict src, size_t count);
说明
将 src
指向的内存中的数据复制到 dest
指向的内存。
如果能够确保 src
和 dest
不存在重叠,则使用 memcpy 可以获得更好的性能。
注意,dest
必须有足够的空间。
参数
dest
- 目标内存地址src
- 源内存地址count
- 要复制的字节数
返回值
- 返回目标地址
dest
本身
#示例
#include <stdio.h>
#include <string.h>
#define N 5
int main(void)
{
int data1[N + 1] = {1, 2, 3, 4, 5};
int data2[N + 1] = {1, 2, 3, 4, 5};
memcpy(data1 + 1, data1, N * sizeof(int)); // 错误的重叠复制
for (size_t i = 0; i < N + 1; i += 1)
{
printf("%d ", data1[i]);
}
printf("\n");
memmove(data2 + 1, data2, N * sizeof(int)); // 正确的重叠复制
for (size_t i = 0; i < N + 1; i += 1)
{
printf("%d ", data2[i]);
}
printf("\n");
return 0;
}
可能的运行结果:
1 1 1 1 1 1 1 1 2 3 4 5
- 编译器优化可能会纠正
memcpy
的错误
#推荐阅读
#参考标准
- C23 standard (ISO/IEC 9899:2024):
- 7.24.2.2 The memmove function (p: TBD)
- C17 standard (ISO/IEC 9899:2018):
- 7.24.2.2 The memmove function (p: 264)
- C11 standard (ISO/IEC 9899:2011):
- 7.24.2.2 The memmove function (p: 363)
- C99 standard (ISO/IEC 9899:1999):
- 7.21.2.2 The memmove function (p: 326)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.11.2.2 The memmove function