Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

2d boolean array initialization in c++

I don't use C that much and I recently got confused about 2d array initialization problem. I need to debug somebody's code and stuck in the following(her original code):

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

I thought is was redundant, so I changed it to the following:

location_matrix[location_num][location_num] = { {false} };

However, segmentation fault happens at runtime. My question is: how does the above code fail? If it looks right, what's the difference between dynamically allocation and static allocation? Is it just because the dimension might not be constant, so we need to do it dynamically? Also, just for curiosity, how do I malloc 2d array that stores pointers? Thanks.

like image 648
Shang Wang Avatar asked Nov 10 '11 17:11

Shang Wang


1 Answers

The change would likely require about 100MB (10,000 * 10,000 * 1) on the stack, so the segmentation fault was likely due to a stack overflow.

Edit I originally stated 400MB in the answer, but @Mooing Duck points out bool will likely be 1 byte. I was thinking the Win32 BOOL (for no real reason at all), which is typedefed to an int.

like image 187
Mark Wilkins Avatar answered Sep 30 '22 09:09

Mark Wilkins