c++中二维布尔数组初始化

2d boolean array initialization in c++

本文关键字:二维 布尔 数组 初始化 c++      更新时间:2023-10-16

我不太使用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二维数组,存储指针?谢谢。

该更改可能需要大约100MB (10,000 * 10,000 * 1)的堆栈,因此分割错误可能是由于堆栈溢出造成的。

Edit我最初在答案中声明400MB,但@Mooing Duck指出bool可能是1字节。我在想Win32 BOOL(根本没有真正的原因),它被类型定义为int。

实际上我没有看到代码有什么问题。

下面的代码不能工作,因为没有分配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指针数组是这样的:

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;
    }
}

标准库是你的朋友。

#include <vector>
int
main()
{
  int location_num = 1000;
  std::vector<std::vector<bool> > location_matrix(location_num, std::vector<bool>(location_num, false));
}

其次,数组可能太大,无法放在堆栈上,因此需要动态分配它——但只要二维数组和指针数组之间的差异不成为问题(如果需要将数组传递给函数或使用指针算术,就会出现这种情况),就可以简化代码。

你可以这样写:

bool (*location_matrix)[location_num];
location_matrix = (bool (*)[location_num])calloc( location_num, 
                                                  location_num * sizeof(bool) );

…它为整个二维数组分配空间,并给出一个指向bool数组的指针,每个location_num元素。