手写实现 memcpy(不处理内存重叠,标准原生 memcpy 特性)

原理说明

  1. void* 无类型指针,不能直接解引用、自增,先转 unsigned char* 按字节拷贝;
  2. size_t 无符号整数,代表要拷贝的字节总数;
  3. 标准 memcpy 不区分源、目标内存是否重叠,重叠场景行为未定义;
  4. 返回目标起始地址。

C 完整实现

#include <stdio.h>
#include <stddef.h>  // size_t

void* memcpy(void *MemDest, const void *MemSrc, size_t size)
{
    // 空指针校验
    if (MemDest == NULL || MemSrc == NULL)
    {
        return NULL;
    }

    // 转为字节指针,逐字节复制
    unsigned char *dest = (unsigned char *)MemDest;
    const unsigned char *src = (const unsigned char *)MemSrc;

    for (size_t i = 0; i < size; i++)
    {
        dest[i] = src[i];
    }

    return MemDest;
}

// 测试代码
int main(void)
{
    char str1[32] = {0};
    char str2[] = "Hello C memcpy test";

    // 拷贝字符串
    memcpy(str1, str2, sizeof(str2));
    printf("%s\n", str1);

    // 拷贝数字数组
    int arrDst[5] = {0};
    int arrSrc[5] = {1,2,3,4,5};
    memcpy(arrDst, arrSrc, sizeof(arrSrc));
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", arrDst[i]);
    }

    return 0;
}

极简指针版(更贴近底层原生写法)

void* memcpy(void *MemDest, const void *MemSrc, size_t size)
{
    if (!MemDest || !MemSrc)
        return NULL;

    unsigned char *dest = (unsigned char *)MemDest;
    const unsigned char *src = (const unsigned char *)MemSrc;

    while (size--)
    {
        *dest++ = *src++;
    }
    return MemDest;
}
Logo

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

更多推荐