asel - 3 years ago 86
C Question

# Using malloc for allocation of multi-dimensional arrays with different row lengths

I have the following

`C`
code :

``````int *a;
size_t size = 2000*sizeof(int);
a = (int *) malloc(size);
``````

which works fine. But if I have the following :

``````char **b = malloc(2000*sizeof *b);
``````

where every element of
`b`
has different length.

How is it possible to do the same thing for
`b`
as i did for
`a`
; i.e. the following code would hold correct?

``````char *c;
size_t size = 2000*sizeof(char *);
c = (char *) malloc(size);
``````

First, you need to allocate array of pointers like `char **c = malloc( N * sizeof( char* ))`, then allocate each row with a separate call to `malloc`, probably in the loop:

``````
/* N is the number of rows  */
/* note: c is char** */
if (( c = malloc( N*sizeof( char* ))) == NULL )
{ /* error */ }

for ( i = 0; i < N; i++ )
{
/* x_i here is the size of given row, no need to
* multiply by sizeof( char ), it's always 1
*/
if (( c[i] = malloc( x_i )) == NULL )
{ /* error */ }

/* probably init the row here */
}

/* access matrix elements: c[i] give you a pointer
* to the row array, c[i][j] indexes an element
*/
c[i][j] = 'a';
``````

If you know the total number of elements (e.g. `N*M`) you can do this in a single allocation.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download