Sha*_*ang 5 c++ initialization multidimensional-array
我没有那么多使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为是多余的,所以我将其更改为以下内容:
location_matrix[location_num][location_num] = { {false} };
但是,分段错误在运行时发生.我的问题是:上面的代码是如何失败的?如果它看起来正确,动态分配和静态分配之间有什么区别?是因为维度可能不是常数,所以我们需要动态地做这个吗?另外,只是为了好奇,我如何malloc 2d数组存储指针?谢谢.
实际上我没有看到代码有什么问题。
以下代码不起作用,因为location_matrix未分配:
location_matrix[location_num][location_num] = { {false} };
Run Code Online (Sandbox Code Playgroud)
GCC 将允许以下内容(作为扩展):
bool location_matrix[location_num][location_num] = { {false} };
Run Code Online (Sandbox Code Playgroud)
但它会破坏你的堆栈,因为10000 x 10000太大了。
目前,您的代码使用动态分配。这是正确的方法,因为矩阵太大,无法作为静态数组完成(并且可能会溢出堆栈)。
至于你的最后一个问题,“如何制作一个存储指针的二维数组”:它可以按照与当前代码几乎相同的方式完成。只需更改bool为int*.
因此 NULL 指针的二维数组int将如下所示:
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;
}
}
Run Code Online (Sandbox Code Playgroud)