国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > memmove 以获得更好的体验。

# C 语言标准库函数 memmove

在头文件 string.h 中定义。
/*********************************************
 * @brief 复制内存数据
 * @param dest 目标内存地址
 * @param src 源内存地址
 * @param count 要复制的字节数
 * @return 目标地址
 ********************************************/
void* memmove(void* restrict dest, const void* restrict src, size_t count);

!subtitle:说明

src 指向的内存中的数据复制到 dest 指向的内存。

如果能够确保 srcdest 不存在重叠,则使用 memcpy 可以获得更好的性能。

注意,dest 必须有足够的空间。

!subtitle:参数

  • dest - 目标内存地址

  • src - 源内存地址

  • count - 要复制的字节数

!subtitle:返回值

  • 返回目标地址 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

本文 更新于: 2025-11-27 09:38:09 创建于: 2025-11-27 09:38:09