You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

自定义实现类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的逻辑)。
  • 参数合法性检查:添加对fromto空指针的判断,以及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

火山引擎 最新活动