C#实现二维数组Zero Padding及现有代码越界错误解决求助
问题原因
你的代码出现数组越界主要有以下几个问题:
- 二维数组维度搞反:C#中
int[,] arr = new int[行数, 列数],GetLength(0)获取的是行数(对应y轴遍历的上限),GetLength(1)获取的是列数(对应x轴遍历的上限),你的代码里把两个值的使用场景完全搞反了。 - 循环边界错误:外层遍历y的上限用了原数组的列数,根本没有遍历完新数组的所有行。
- 边界判断越界:数组下标从0开始,合法的最大下标是
长度-1,你直接判断y == ArrayZeroPad.GetLength(1),这个值本身已经超出数组下标的合法范围。 - 原数组取值没有做偏移处理:新数组中从下标1开始才对应原数组的内容,你直接用新数组的x、y下标取原数组的值,也会出现越界。
修正后的可运行代码
using System; class Program { static void Main() { // 原数组 int[,] originalArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; // 新数组行列数各加2,因为上下左右各加一圈0 int padRows = originalArray.GetLength(0) + 2; int padCols = originalArray.GetLength(1) + 2; int[,] arrayZeroPad = new int[padRows, padCols]; // 遍历新数组的每一行 for (int y = 0; y < padRows; y++) { // 遍历新数组的每一列 for (int x = 0; x < padCols; x++) { // 如果是第一行、最后一行、第一列、最后一列,赋值为0 if (y == 0 || y == padRows - 1 || x == 0 || x == padCols - 1) { arrayZeroPad[y, x] = 0; } // 其余位置对应原数组的内容,原数组下标要减1,去掉边框的偏移 else { arrayZeroPad[y, x] = originalArray[y - 1, x - 1]; } } } // 输出结果 for (int y = 0; y < padRows; y++) { for (int x = 0; x < padCols; x++) { Console.Write(arrayZeroPad[y, x] + " "); } Console.WriteLine(); } Console.ReadLine(); } }
代码说明
- 初始化新数组的时候先单独定义行列变量,避免后续重复调用
GetLength出错,也更容易理解。 - 因为int类型的默认值就是0,其实你甚至不需要单独给边框赋值,只要把中间对应原数组的位置赋值即可,上面的写法是为了更直观符合你的逻辑。
- 原数组的坐标和新数组的坐标偏移差1,所以取原数组值的时候要用新数组的下标减1,避免越界。
- 输出部分去掉了多余的换行和每次行结束的ReadLine,只在全部输出完成后等待输入。
运行后输出结果如下:
0 0 0 0 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 0
内容的提问来源于stack exchange,提问作者user15916724
相关产品推荐
相关产品推荐

