我没有那么多使用C,最近我对2d数组初始化问题感到困惑。我需要调试某人的代码并坚持以下(她的原始代码):
const int location_num = 10000;
bool **location_matrix;
if (node_locations)
{
location_matrix = (bool **)malloc(location_num*sizeof(bool *));
if (!location_matrix)
{
cout<<"error 1 allocating location_matrix" << endl;
exit;
}
for (i=0; i<location_num; i++)
{
location_matrix[i] = (bool *) malloc(location_num*sizeof(bool ));
if (!location_matrix[i])
{
cout<<"error 2 allocating location_matrix" << endl;
exit;
}
for (j=0; j<location_num; j++)
location_matrix[i][j] = false;
}
}
我认为这是多余的,所以我将其更改为以下内容:
location_matrix[location_num][location_num] = { {false} };
但是,分段错误在运行时发生。 我的问题是:上面的代码是如何失败的?如果它看起来正确,动态分配和静态分配之间有什么区别?是因为维度可能不是常数,所以我们需要动态地做这个吗? 另外,只是为了好奇,我如何malloc 2d数组存储指针?感谢。
答案 0 :(得分:4)
更改可能需要在堆栈上大约100MB(10,000 * 10,000 * 1
),因此分段错误可能是由于堆栈溢出。
编辑我最初在答案中说了400MB,但@Mooing Duck指出bool可能是1个字节。我在考虑Win32 BOOL(根本没有任何理由),它被输入到int中。
答案 1 :(得分:2)
我实际上没有看到代码有任何问题。
以下代码不起作用,因为未分配location_matrix
:
location_matrix[location_num][location_num] = { {false} };
GCC将允许以下(作为扩展名):
bool location_matrix[location_num][location_num] = { {false} };
但是由于10000 x 10000
太大,它会打击你的筹码。
目前,您的代码使用动态分配。这是正确的方法,因为矩阵太大而无法作为静态数组完成(并且可能会超出堆栈)。
关于你的上一个问题,“如何创建一个存储指针的二维数组”:它可以与你当前的代码几乎完全相同。只需将bool
更改为int*
。
所以NULL int
指针的2D数组将如下所示:
int ***location_matrix;
if (node_locations)
{
location_matrix = (int***)malloc(location_num*sizeof(int**));
if (!location_matrix)
{
cout<<"error 1 allocating location_matrix" << endl;
exit;
}
for (i=0; i<location_num; i++)
{
location_matrix[i] = (int**) malloc(location_num*sizeof(int*));
if (!location_matrix[i])
{
cout<<"error 2 allocating location_matrix" << endl;
exit;
}
for (j=0; j<location_num; j++)
location_matrix[i][j] = NULL;
}
}
答案 2 :(得分:2)
标准库是你的朋友。
#include <vector>
int
main()
{
int location_num = 1000;
std::vector<std::vector<bool> > location_matrix(location_num, std::vector<bool>(location_num, false));
}
答案 3 :(得分:1)
其次,数组可能太大而无法放在堆栈上,因此您需要动态分配它 - 但只要difference between a 2-dimensional array and an array of pointers不成问题就可以简化代码(因为如果你需要将数组传递给函数或者使用指针算法,那就好了。
您可以使用以下内容:
bool (*location_matrix)[location_num];
location_matrix = (bool (*)[location_num])calloc( location_num,
location_num * sizeof(bool) );
...为整个二维数组分配空间,并给出一个指向bool
数组的指针,每个数组都有location_num
个元素。