memcpy的模拟实现 目录摘要一memcpy的使用1完整复制整形数组2部分复制整形数组3完整复制字符数组4部分复制字符数组二memcpy的实现​​​​​​​摘要本文介绍并实现memcpy~一memcpy的使用函数原型void * memcpy ( void * destination, const void * source, size_t num );参数解释dest目标内存地址的指针即复制后的数据存放位置。src源内存地址的指针即要被复制的数据来源。n要复制的字节数。函数功能将数据从src指向的内存区域复制n个字节到dest指向的内存区域。按字节逐一复制。不会在复制的时候遇到\0而停止与字符串函数strcpy不同。适用于任意数据类型int、float、结构体、数组等。返回值返回dest的指针即目标内存区域的首地址。注意事项①内存区域不能重叠重叠则必须使用memmove⚠️对于重叠谨记使用memmove某些编译器上memcpy也可以处理重叠的比如vs但不意味着所有编译器的memcpy上都可以实现重叠拷贝所以我们模拟实现memcpy的时候也只需要针对不重叠的情况去实现。②复制\0不会停止因为memcpy完全按字节复制不关心内容⚠️所以对于字符数组来说如果复制的内容没有包含\0结束符则需要自己手动加上使用示例1完整复制整形数组#include stdio.h #include string.h int main() { int src[] {1, 2, 3, 4, 5}; int dest[5]; memcpy(dest, src, sizeof(src)); printf(整型数组完整复制\n); for (int i 0; i 5; i) { printf(%d , dest[i]); } printf(\n); return 0; }解释sizeof(src)计算的就是src这个被复制的数组的大小字节数2部分复制整形数组#include stdio.h #include string.h int main() { int src[] { 10, 20, 30, 40, 50 }; int dest[5] { 0 }; memcpy(dest, src, 3 * sizeof(int)); printf(整型数组部分复制只复制前3个\n); for (int i 0; i 5; i) { printf(%d , dest[i]); } printf(\n); return 0; }解释对部分复制往往采取sizeof计算出单个元素类型的大小然后乘上数目3完整复制字符数组#include stdio.h #include string.h int main() { char src[] Hello; char dest[10]; memcpy(dest, src, strlen(src) 1); printf(字符数组完整复制\n); printf(%s\n, dest); return 0; }解释对于Hello来说strlen(src)返回值为5但我们需要1去把\0也复制4部分复制字符数组#include stdio.h #include string.h int main() { char src[] Hello; char dest[10]; memcpy(dest, src, 3); dest[3] \0; printf(字符数组部分复制只复制前3个手动加结束符\n); printf(%s\n, dest); return 0; }解释对于字符数组的部分复制我们往往会在dest数组后面手动置\0二memcpy的实现void * memcpy ( void * destination, const void * source, size_t num );两个参数的类型都是void *是因为memcpy身为一个内存函数是以字节为单位进行操作的所以适配于很多类型不知道传过来的是什么类型所以用void *接收内部再强转为char*以字节为单位进行操作即可而const修饰source代表不会对被复制的内存进行修改所以我们模拟实现的思路就是强转为char*之后然后进行num次的逐字节复制代码#include assert.h void *my_memcpy(void *dst, const void *src, size_t count) { void *ret dst; // 保存原地址用于返回 assert(dst src); // 断言非空 while (count--) { *(char *)dst *(char *)src; // 逐字节复制 dst (char *)dst 1; // 指针后移1字节 src (char *)src 1; } return ret; }解释①首先 肯定是需要用ret保存一下dst指针的用于最后的返回因为dst会在后面的代码中改变②断言检测dst和src指针其一为空则代表用于传参错误直接报错③以count为循环次数在while循环的内部将dst和src强转为char*进行逐字节的复制 [ 作者 ] shylyly [ 首次发布 ] 2024.3.20❌ [ 最新修改 ] 2026.10.14 [ 声明 ] 由于笔者水平有限文中难免有疏漏或不妥之处还望读者不吝赐教。