目录

一、memcpy 函数概述

函数特性:

复制内存块

二、memcpy 使用示例

输出结果:

三、注意事项

四、memcpy 的模拟实现

实现说明:

限制:


一、memcpy 函数概述

memcpy 是 C 语言标准库中的一个内存拷贝函数,其原型如下:

void *memcpy(void *destination, const void *source, size_t num);

函数特性:

  • 从 source 指向的内存位置开始,向后复制 num 个字节的数据到 destination 指向的内存位置

  • 该函数不会因为遇到 '\0' 而停止复制(与 strcpy 不同)

  • 如果 source 和 destination 内存区域有重叠,复制结果是未定义的(行为不可预测,可能会无限循环地执行)

  • 返回目标内存的起始地址(即 destination 的值)

复制内存块

将源地址开始的 num 字节数据直接复制到目标地址。

此函数执行二进制数据拷贝,不考虑源和目标指针的基础数据类型。

函数会严格复制指定字节数,不会检查源数据中的终止空字符。

注意事项:

  1. 为避免溢出,源和目标数组的大小至少应为 num 字节
  2. 源和目标内存块不应重叠(如需处理重叠内存块,建议使用 memmove 函数)

二、memcpy 使用示例

#include <stdio.h>
#include <string.h>

int main()
{
    int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int arr2[10] = {0};
    
    // 复制 arr1 的前 20 个字节(即前 5 个 int 元素)到 arr2
    memcpy(arr2, arr1, 20);
    
    // 输出 arr2 的内容
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", arr2[i]);
    }
    
    return 0;
}

输出结果:


三、注意事项

        对于重叠的内存区域(即源地址和目标地址有重叠的情况),应该使用 memmove 函数而非 memcpymemmove 会处理重叠情况,保证复制结果正确。(后续会讲解,不急,先知道先)


四、memcpy 的模拟实现

以下是 memcpy 函数的一个模拟实现:

#include <assert.h>

void *my_memcpy(void *dst, const void *src, size_t count)
{
    void *ret = dst;  // 保存目标地址用于返回
    
    // 检查参数有效性
    assert(dst != NULL);
    assert(src != NULL);
    
    // 逐字节从低地址向高地址复制
    while (count--) {
        *(char *)dst = *(char *)src;
        dst = (char *)dst + 1;
        src = (char *)src + 1;
    }
    
    return ret;  // 返回目标内存起始地址
}

使用上面的使用实例可以看到可以完成内存拷贝功能:

实现说明:

  1. 使用 assert 确保目标地址和源地址非空

  2. 将 void* 指针转换为 char* 以实现逐字节复制

  3. 按从低地址到高地址的顺序复制数据

  4. 返回原始的目标地址,与标准库行为一致

限制:

  • 此实现不处理内存重叠情况

  • 实际标准库实现可能会使用更高效的块复制方式(如一次复制 4 或 8 字节)

这个模拟实现帮助我们理解 memcpy 的基本工作原理,但在实际开发中应优先使用标准库的实现。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐