Allocate a two dimensional array using one call of malloc in C

Problem

Write a function called my2DAlloc which allocates a two dimensional array. Minimize the number of calls to malloc and make sure that the memory is accessible by the notation arr[i][j].

Solution

We will use one call to malloc.
Allocate one block of memory to hold the row vector and the array data. The row vector will reside in rows * sizeof(int*) bytes. The integers in the array will take up another rows * cols * sizeof(int) bytes.
Constructing the array in a single malloc has the added benefit of allowing disposal of the array with a single free call rather than using a special function to free the subsidiary data blocks.

int\*\* My2DAlloc(int rows, int cols) {  
    int header = rows \* sizeof(int\*);  
    int data = rows \* cols \* sizeof(int);  
    int\*\* rowptr = (int\*\*)malloc(header + data);  
    int\* buf = (int\*)(rowptr + rows);  
    int k;  
    for (k = 0; k < rows; ++k) {  
        rowptr\[k\] = buf + k\*cols;  
    }  
    return rowptr;  
}  

Here is a demo:

References
http://tianrunhe.wordpress.com/2012/04/23/allocate-a-two-dimensional-array-using-one-call-of-malloc-in-c/


See also