为什么此多维数组出现分段错误?

时间:2020-02-11 03:14:10

标签: c++

我想创建2D指针布尔数组,但是一旦声明并尝试对其进行初始化,就会遇到分段错误。我尝试仅声明数组而不初始化它,并且也尝试初始化数组。

我的程序中有一些函数和全局变量,并尝试制作除主函数#include外的所有东西,并使用命名空间std;。进入评论,但我仍然收到错误: 只声明:

int main(){
    // Variable declarations. You can add more if necessary
    bool **world;
    int nrows, ncols;
    char next;

    cout << "Enter world dimensions (rows and columns): ";
    cin >> nrows >> ncols;


    **world = new bool*[ncols];
    for (int   i = 0; i < ncols; i++) {
      world[i] = new bool[nrows];
    }   

声明和初始化:

int main(){
    // Variable declarations. You can add more if necessary
    bool **world;
    int nrows, ncols;
    char next;

    cout << "Enter world dimensions (rows and columns): ";
    cin >> nrows >> ncols;


    **world = new bool*[ncols];
    for (int   i = 0; i < ncols; i++) {
      world[i] = new bool[nrows];
    }   
    for (int i = 0; i < ncols; ++i) {
      for (int j = 0; j < nrows; ++j) {
        world[i][j] = false;
      }
    } 

错误是:Segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:1)

**world = new bool*[ncols];等效于world[0][0] = new bool*[ncols];,因为世界尚未初始化,这是不确定的行为。这仅是因为指针可转换为bool。如果您的数组是int之类的其他类型,则您的代码将无法编译。

您实际想要做的就是分配给指针:

world = new bool*[ncols];

std::vector将使您的代码更简单,更安全,这一行替换了所有初始化代码,并且没有内存泄漏:

std::vector<std::vector<bool>> world(ncols, std::vector<bool>(nrows, false));

我是一般的多维数组,矢量的性能较差,最好使用一维数组并通过以下方法计算索引:col * nrows + row