填充数组会导致阵列周围的堆栈损坏

时间:2015-02-15 07:12:49

标签: c++ arrays

我正在尝试使用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); 


    }

}

4 个答案:

答案 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];

您可以使用gdbvalgrind或其他任何内容来查找细分错误的原因。