我正在尝试使用for循环中的for循环填充0到25之间的随机数的4x6数组。生成数组后发生运行时错误 - “堆栈变量”网格“已损坏。是什么导致这种情况发生?
int grid[4][6];
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 6; x++) {
grid[x][y] = (rand() % 25);
}
}
答案 0 :(得分:1)
你正在写出界限。例如,你的循环可以写入(5,3),它位于数组的边界之外。为了解决这个问题,请使用x
作为外部循环,使用y
作为内部循环。
答案 1 :(得分:1)
我认为你的指数是倒退的,你有x,它应该是y,反之亦然
答案 2 :(得分:0)
正如其他人所说的那样,你的行和列索引已经倒退了。这是一个问题的原因是在C和C ++中,2D数组访问:
grid[x][y]
被视为等效的指针表达式:
*(grid + (x*COLS + y))
在这种情况下,由于C和C ++使用行主要排序,因此COLS为6.此外,2D数组相当于一维大小的数组(ROWS * COLS),这意味着在这种情况下,您可以有效地解决元素该1D阵列的0到23之间。
现在,看看你的循环结构,你可以看到,给定指针算术规则,当x为4且y为0时,你将访问元素24(从而破坏堆栈) - 即*(grid + 4 * 6 + 0),或内循环的第四次迭代。
切换循环顺序(0 <= x <4且0 <= y <6),您的问题就会消失。
答案 3 :(得分:0)
int grid[6][4];
您可以使用gdb
,valgrind
或其他任何内容来查找细分错误的原因。