手写实现 memcpy
·
手写实现 memcpy(不处理内存重叠,标准原生 memcpy 特性)
原理说明
void*无类型指针,不能直接解引用、自增,先转unsigned char*按字节拷贝;size_t无符号整数,代表要拷贝的字节总数;- 标准
memcpy不区分源、目标内存是否重叠,重叠场景行为未定义; - 返回目标起始地址。
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;
}更多推荐



所有评论(0)