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