C++中用二维数组指针复制结构体——指针算术问题
嘿,我来帮你把这段代码里的问题逐个拆解清楚——不止是二维数组访问的坑,还有几个容易忽略的小错误:
一维指针不能直接用二维数组语法访问
你的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

