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.
I actually don’t see anything wrong with the code.
The following code doesn’t work because
location_matrixis not allocated:GCC will allow the following (as an extension):
But it will blow your stack because
10000 x 10000is too large.Currently, your code uses dynamic allocation. That’s the correct way to do it because the matrix is too large to be done as a static array (and may overrun the stack).
As for your last question, “how to make a 2d array that stores pointers”: It can be done almost the same way as your current code. Just change
booltoint*.So a 2D array of NULL
intpointers will look like this: