# How to dynamically allocate a 2D array in C?

Following are different ways to create a 2D array on heap (or dynamically allocate a 2D array).

In the following examples, we have considered ‘r‘ as number of rows, ‘c‘ as number of columns and we created a 2D array with r = 3, c = 4 and following values

```  1  2  3  4
5  6  7  8
9  10 11 12 ```

1) Using a single pointer:
A simple way is to allocate memory block of size r*c and access elements using simple pointer arithmetic.

 `#include ` `#include ` ` `  `int` `main() ` `{ ` `    ``int` `r = 3, c = 4; ` `    ``int` `*arr = (``int` `*)``malloc``(r * c * ``sizeof``(``int``)); ` ` `  `    ``int` `i, j, count = 0; ` `    ``for` `(i = 0; i <  r; i++) ` `      ``for` `(j = 0; j < c; j++) ` `         ``*(arr + i*c + j) = ++count; ` ` `  `    ``for` `(i = 0; i <  r; i++) ` `      ``for` `(j = 0; j < c; j++) ` `         ``printf``(``"%d "``, *(arr + i*c + j)); ` ` `  `   ``/* Code for further processing and free the  ` `      ``dynamically allocated memory */` `   `  `   ``return` `0; ` `} `

Output:

`1 2 3 4 5 6 7 8 9 10 11 12`

2) Using an array of pointers
We can create an array of pointers of size r. Note that from C99, C language allows variable sized arrays. After creating an array of pointers, we can dynamically allocate memory for every row.

 `#include ` `#include ` ` `  `int` `main() ` `{ ` `    ``int` `r = 3, c = 4, i, j, count; ` ` `  `    ``int` `*arr[r]; ` `    ``for` `(i=0; i

Output:

`1 2 3 4 5 6 7 8 9 10 11 12`

3) Using pointer to a pointer
We can create an array of pointers also dynamically using a double pointer. Once we have an array pointers allocated dynamically, we can dynamically allocate memory and for every row like method 2.

 `#include ` `#include ` ` `  `int` `main() ` `{ ` `    ``int` `r = 3, c = 4, i, j, count; ` ` `  `    ``int` `**arr = (``int` `**)``malloc``(r * ``sizeof``(``int` `*)); ` `    ``for` `(i=0; i

Output:

`1 2 3 4 5 6 7 8 9 10 11 12`

4) Using double pointer and one malloc call

 `#include ` `#include ` ` `  `int` `main() ` `{ ` `    ``int` `r=3, c=4, len=0; ` `    ``int` `*ptr, **arr; ` `    ``int` `count = 0,i,j; ` ` `  `    ``len = ``sizeof``(``int` `*) * r + ``sizeof``(``int``) * c * r; ` `    ``arr = (``int` `**)``malloc``(len); ` ` `  `    ``// ptr is now pointing to the first element in of 2D array ` `    ``ptr = (``int` `*)(arr + r); ` ` `  `    ``// for loop to point rows pointer to appropriate location in 2D array ` `    ``for``(i = 0; i < r; i++) ` `        ``arr[i] = (ptr + c * i); ` ` `  `    ``for` `(i = 0; i < r; i++) ` `        ``for` `(j = 0; j < c; j++) ` `            ``arr[i][j] = ++count; ``// OR *(*(arr+i)+j) = ++count ` ` `  `    ``for` `(i = 0; i < r; i++) ` `        ``for` `(j = 0; j < c; j++) ` `            ``printf``(``"%d "``, arr[i][j]); ` ` `  `    ``return` `0; ` `} `

Output:

`1 2 3 4 5 6 7 8 9 10 11 12`

Thanks to Trishansh Bhardwaj for suggesting this 4th method.

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.

My Personal Notes arrow_drop_up

Improved By : NileshAwate, dncdd

Article Tags :
Practice Tags :

43

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.