这个简单的炭填料有什么问题?

时间:2012-02-28 00:44:30

标签: c++

它似乎看起来非常简单,但是char数组看似随机的点不能正确填充8。也没有编译器错误。对不起,这是一个非常棒的问题,但是当我一个月前设计一个数独求解器时,运行与此几乎相同的代码没有任何问题。

#include <iostream>
using namespace std;

int main () {

//Initiates initial board.
char board[30][27];

//Fills entire board with b's to represent the edges of the board where the pac-man cannot go.
for (int control=0; control<31; control++) {
    for (int control2=0; control2<28; control2++) {
        board[control][control2]='8';
    }
}

//Code here filling the board with spaces representing where the pac-man can go.

//Temporary render of board.
for (int control=0; control<31; control++) {
    for (int control2=0; control2<28; control2++) {
        cout << board[control][control2];
    }
    cout << endl;
}

return 0;
}

显然有一个随机分段错误。

3 个答案:

答案 0 :(得分:5)

分段错误几乎不是随机的。你正在超越阵列的界限。 board[30]和董事会[] [28]各自超出各自维度。在这种情况下,您可能会覆盖main()的返回地址,因此您的程序会进入杂草,然后就像您在分段故障中看到的那样死亡。将您的循环条件更改为:

control < 30

control2 < 27

你应该没事。您还可以将数组的大小更改为board[31][28]

最重要的是,您还应该学会使用调试器,您可以使用它来查找失败时controlcontrol2变量的值,哪个会解决这个问题,而不必在这里问。

答案 1 :(得分:3)

您正在索引超过数组的最大值。

您可以在board上执行的最大索引是board[29][26],因为您放置的30和27是元素数量,数组是零索引。

答案 2 :(得分:3)

你超出了矩阵的大小。你有:

char board[30][27];

但你的循环是:

for (int control=0; control<31; control++) {
    for (int control2=0; control2<28; control2++) {

他们会将每个维度超过1。

因此,要么将矩阵更改为:char board[31][28];,要么从循环中删除迭代。