How to allocate dynamic memory for 2d array in function ? I tried this way:
int main()
{
int m=4,n=3;
int** arr;
allocate_mem(&arr,n,m);
}
void allocate_mem(int*** arr,int n, int m)
{
*arr=(int**)malloc(n*sizeof(int*));
for(int i=0;i<n;i++)
*arr[i]=(int*)malloc(m*sizeof(int));
}
But it doesn't work.
Your code is wrong at
*arr[i]=(int*)malloc(m*sizeof(int));
because the precedence of the[]
operator is higher than the*
deference operator: In the expression*arr[i]
, firstarr[i]
is evaluated then*
is applied. What you need is the reverse (dereferencearr
, then apply[]
).Use parentheses like this:
(*arr)[i]
to override operator precedence. Now, your code should look like this:To understand further what happens in the above code, read this answer.
It is important that you always deallocate dynamically allocated memory explicitly once you are done working with it. To free the memory allocated by the above function, you should do this:
Additionally, a better way to create a 2D array is to allocate contiguous memory with a single
malloc()
function call as below:To deallocate this memory:
Notice that in the second technique malloc is called only two times, and so in the deallocation code free is called only two times instead of calling it in a loop. So this technique should be better.
Try the following code:
Consider this: Just single allocation
To Free:
If your array does not need to be resized (well, you can, but il will be a bit more complicated), there is an easier/more efficient way to build 2D arrays in C.
Take a look at http://c-faq.com/aryptr/dynmuldimary.html.
The second method (for the array called array2) is quite simple, less painful (try to add the tests for mallocs' return value), and way more efficient.
I've just benchmarked it, for a 200x100 array, allocated and deallocated 100000 times:
And the data in the array will be more contiguous, which may speed things up (you may get some more efficient techniques to copy, reset... an array allocated this way).
2d Array dynamically array using malloc:
That is an unnecessarily complicated way of allocating space for an array. Consider this: