Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个多维数组会出现分段错误?_C++ - Fatal编程技术网

C++ 为什么这个多维数组会出现分段错误?

C++ 为什么这个多维数组会出现分段错误?,c++,C++,我想创建一个2D指针布尔数组,但一旦我声明它并尝试初始化它,就会出现分段错误。我试着只声明数组而不初始化它,我也试着初始化数组 我在我的程序中有一些函数和全局变量,并且尝试了除主函数之外的所有函数,包括和使用名称空间std;但我仍然得到了错误: 仅声明: int main(){ // Variable declarations. You can add more if necessary bool **world; int nrows, ncols; char n

我想创建一个2D指针布尔数组,但一旦我声明它并尝试初始化它,就会出现分段错误。我试着只声明数组而不初始化它,我也试着初始化数组

我在我的程序中有一些函数和全局变量,并且尝试了除主函数之外的所有函数,包括和使用名称空间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];
    }   
intmain(){
//变量声明。如果需要,可以添加更多
布尔**世界;
int nrows,ncols;
下一步;
cout>nrows>>ncols;
**世界=新布尔*[ncols];
对于(int i=0;i
声明和初始化:

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;
      }
    } 
intmain(){
//变量声明。如果需要,可以添加更多
布尔**世界;
int nrows,ncols;
下一步;
cout>nrows>>ncols;
**世界=新布尔*[ncols];
对于(int i=0;i

错误是:
分段错误(堆芯转储)
**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));
std::vector世界(ncols,std::vector(nrows,false));

<一般的多维数组和向量的性能较差,最好是使用一维数组并计算索引:“代码> CordnRe+行< /Calp>< /P> C++中,你应该转向使用<代码> STD::向量< /代码>,并且远离使用“代码>新[]的手动分配”。 .<代码> *Work=新BoOL[nCOLs ];这不符合你的想法。C++编译器警告你这条线吗?你将需要实现一个简单的(即一维的)数组。除了@SamVarshavchik所说的之外,许多编译器还允许您调整它们产生的警告。例如,对于
gcc
,您可以通过
-Wall
查看所有警告,并
-Werr
将任何警告视为错误。无论如何,@SamVarshavchik暗示修复是
world=new bool*[ncols]
-您要使
成为世界
,请指向新分配的指向布尔值的指针数组。也许这个问题会有一些有帮助的答案: