You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中用二维数组指针复制结构体——指针算术问题

你的C++ Map复制代码问题解析与修正

嘿,我来帮你把这段代码里的问题逐个拆解清楚——不止是二维数组访问的坑,还有几个容易忽略的小错误:

  • 一维指针不能直接用二维数组语法访问
    你的Map结构体里loc是int*类型,它指向的是一块连续的一维内存块(应该是把二维数组扁平化存储的)。C++不会自动把这个一维指针解析成二维数组,[i][j]这种语法只对真正的二维数组(或者指向数组的指针)生效。要模拟二维访问,你得手动计算内存偏移量:
    假设是行优先存储(先存完一行所有列,再存下一行),那坐标(i,j)(i是列索引,j是行索引)对应的一维索引就是 j * src->x + i——因为每一行有x个元素,前j行一共占了j*x个位置,再加上当前行的第i个元素就是最终索引。

  • 循环变量更新写错了
    外层循环里你写的是x++,内层是y++,这完全搞错了!循环变量是i和j,所以应该是i++和j++,不然循环要么直接跑飞,要么死循环,根本没法正常遍历。

  • return语句放错位置了
    你在内层循环里加了return;,这会让函数第一次进入循环就直接退出,连第一个元素都没处理完就结束了!你想要的是跳过值为32的元素,所以应该把return删掉(或者改成continue;,不过这里if不满足就不执行赋值,continue其实没必要)。

  • 变量名拼写错误
    函数参数是Map *dst,但你代码里写的是dest->loc——dest是没定义的变量,得改成dst->loc才能编译通过。

  • 别忘了同步目标Map的尺寸
    复制的时候一定要把src的x和y赋值给dst,不然就算你把内存内容复制完了,dst的尺寸不对,后续访问也会出问题。

给你修正后的完整代码:

/* Map是一个二维数组,宽度=x,高度=y */
/* 若src中loc的值为32,则不复制到dest */
struct Map {
    int *loc;
    int x; // 宽度(列数)
    int y; // 高度(行数)
};

/* 将Map从源复制到目标 */
void copyMap(Map *src, Map *dst) {
    // 先同步目标Map的尺寸
    dst->x = src->x;
    dst->y = src->y;

    // 行优先遍历:先遍历每一行(j为行索引),再遍历每一列(i为列索引)
    for (int j = 0; j < src->y; j++) {
        for (int i = 0; i < src->x; i++) {
            int index = j * src->x + i; // 计算一维数组的偏移量
            // 若loc为32则跳过保存到dst
            if (src->loc[index] != 32) {
                dst->loc[index] = src->loc[index];
            }
        }
    }
}

补充一句:如果你的loc是按列优先存储的(先存完一列所有行,再存下一列),那偏移量改成 i * src->y + j 就可以了,核心是根据你实际的存储方式计算正确的索引。

内容的提问来源于stack exchange,提问作者WurlWind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:08:09