手写实现 memcpy

手写实现 memcpy

手写实现 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; }