奇怪的数组东西(数组索引获取值而不设置它)

时间:2014-07-03 00:21:48

标签: c++ arrays

我正在尝试编写一个数独求解器。

我几乎完成了输入,但是一些奇怪的事情开始发生了。在[i][9]的索引int sudoku[i][9]上,有一些我从未放过的数字。 例如,当我使用using namespace std;下方注释的输入运行下面的代码时,输​​出为:

410270805
085146097
070580040
927451386
538697412
164328759
852704900
090802574
740965028

当然,我只需要0到8,但我想知道是什么导致整数出现在第9个索引。

这是代码:

#include <iostream>
#include <math.h>
#include <cstdlib>

using namespace std;

/*
410270805
085146097
070580040
927451386
538697412
164328759
852704900
090802574
740965028
*/

int main()
{
    int sudoku[9][9];
    int solving[9][9][9];
    int input;
    for (int i=0; i<=8; i++) {
        cin >> input;
        int j;
        int k;
        for (j=8, k=1; j>=0; j--, k++) {
            int asdf = input/pow(10,k-1);
            sudoku[i][j] = asdf % 10;
        }
    }
    cout << endl;
    for (int i=0; i<=8; i++) {
        for (int j=0; j<=9; j++) {
            cout << sudoku[i][j];
        }
        cout << endl;
    }
    return 0;
}

2 个答案:

答案 0 :(得分:2)

访问数组定义区域之外的元素是Undefined Behavior(UB)。

这意味着它可以:

  1. 允许您访问未初始化的空间(您正在做的是随机数)
  2. 段错误
  3. 任意数量的其他随机事物。
  4. 基本上不要这样做。

    事实上,阻止自己做到这一点。将这些数组替换为std::vectors并使用.at()调用。

    例如:

    std::vector<std::vector<int>> sudoku(9, std::vector<int>(9, 0));
    for (int i=0; i<=8; i++) {
        for (int j=0; j<=9; j++) {
            cout << sudoku.at(i).at(j);
        }
        cout << endl;
    }
    

    然后,您将获得抛出的运行时异常,该异常解释您的问题而不是随机整数或段错误。

答案 1 :(得分:-2)

我认为我发现了您的问题,在您使用j <= 9代替j <= 8的最后一个循环中。然后,您尝试编写(j),这样就可以将9打开。{1}}。尝试将9替换为8