自定义实现类memcpy数组复制函数失败,寻求技术解决方法
你的Memcpy函数问题分析与修复方案
兄弟,我一眼就看到你代码里的致命问题了——char类型复制的循环逻辑完全写反了,这直接导致数据根本没被复制!让我一步步给你拆解问题,再给你修正后的代码:
核心问题点
- 循环条件完全错误:你在char分支里写了
for(int i = length; i < length; i++),初始i等于length,循环条件又是i小于length,这循环一次都不会跑啊!正确的应该是从0开始遍历到length-1,这样才能完成length次复制。 - 冗余的条件判断:你用了两个独立的
if,当dimension是char的大小时,代码还会去检查int的条件,改成if...else if更高效,也符合逻辑。 - int分支代码不完整:你贴的代码里int分支没写完,推测你大概率会犯和char分支一样的循环错误,得一起修正。
修正后的完整代码
void Memcpy( void *from, void *to, int dimension, int length ) { if(dimension == sizeof(char)){ char *copyFrom = (char *)from; char *copyTo = (char *)to; // 从0开始遍历,完成length次复制 for(int i = 0; i < length; i++) { copyTo[i] = copyFrom[i]; } } else if(dimension == sizeof(int)){ int *copyFrom = (int *)from; int *copyTo = (int *)to; // 同样修正循环逻辑 for(int i = 0; i < length; i++) { copyTo[i] = copyFrom[i]; } } // 可选:添加默认分支处理未知类型,比如打印错误或断言 }
额外优化建议
如果你想让这个函数更接近标准memcpy的通用性和健壮性,还可以做这些改进:
- 处理内存重叠:标准
memcpy不处理源地址和目标地址重叠的情况,如果你的场景可能出现这种情况,需要改成从后往前复制(类似memmove的逻辑)。 - 参数合法性检查:添加对
from、to空指针的判断,以及length非负的检查,避免程序崩溃。 - 通用化实现:其实不用分类型判断,直接通过
dimension * length计算总字节数,用单字节循环就能支持所有类型,代码更简洁:
void Memcpy( void *from, void *to, int dimension, int length ) { // 先做参数合法性检查 if(from == NULL || to == NULL || length < 0) { // 这里可以根据需求处理,比如直接返回或者用断言终止程序 return; } char *src = (char *)from; char *dest = (char *)to; int total_bytes = dimension * length; for(int i = 0; i < total_bytes; i++) { dest[i] = src[i]; } }
这样不管是char、int,还是double、自定义结构体,只要传入正确的dimension(比如sizeof(MyStruct)),就能正确复制数据。
内容的提问来源于stack exchange,提问作者John J




