Using Single Pointer
A single pointer can be used to dynamically allocate a 2D array in C. This means that a memory block of size row*column*dataTypeSize is allocated using malloc, and the matrix elements are accessed using pointer arithmetic.
#include <stdio.h>
#include <stdlib.h>
int main() {
int row = 2, col = 3; //number of rows=2 and number of columns=3
int *arr = (int *)malloc(row * col * sizeof(int));
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
*(arr + i*col + j) = i + j;
printf("The matrix elements are:\n");
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%d ", *(arr + i*col + j));
}
printf("\n");
}
free(arr);
return 0;
}
Output:

Using an Array of Pointers
As shown below, we can dynamically create an array of size M pointers and then dynamically allocate memory of size N for each row:

Source
#include <stdio.h>
#include <stdlib.h>
int main()
{
int r = 3, c = 4, i, j, count; //number of rows=3 and number of columns=4
int* arr[r];
for (i = 0; i < r; i++)
arr[i] = (int*)malloc(c * sizeof(int));
// Note that arr[i][j] is same as *(*(arr+i)+j)
count = 0;
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]);
// free the dynamically allocated memory
for (i = 0; i < r; i++)
free(arr[i]);
return 0;
}
Output:

You can also read about dynamic array in c and Short int in C Programming
Using pointer to a pointer
A double pointer can also be used to dynamically create an array of pointers. We can dynamically allocate memory and for each row once we have an array pointer allocated dynamically.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int r = 3, c = 4, i, j, count; //number of rows=3 and number of columns=4
int** arr = (int**)malloc(r * sizeof(int*));
for (i = 0; i < r; i++)
arr[i] = (int*)malloc(c * sizeof(int));
// Note that arr[i][j] is same as *(*(arr+i)+j)
count = 0;
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]);
// free the dynamically allocated memory
for (i = 0; i < r; i++)
free(arr[i]);
free(arr);
return 0;
}
Output:

You can practice by yourself with the help of the C online compiler.
Must Read Decision Making in C
FAQs
What is pointer to pointer?
Multiple indirection, or a chain of pointers, is pointer to pointer aka double pointer. A pointer normally contains the address of a variable. When we define a pointer to a pointer, the first pointer contains the address of the second pointer, which points to the value's location.
What is malloc()?
In C, the "malloc" or "memory allocation" method is used to allocate a single large block of memory with the specified size dynamically. It returns a void pointer that can be cast into any type of pointer. It does not initialize memory at execution time, so each block is initially set to the default garbage value.
What is free()?
The "free" method in C is used to de-allocate memory dynamically. The memory allocated by malloc() and calloc() is not automatically de-allocated. As a result, whenever dynamic memory allocation occurs, the free() method is used. It frees up memory, which helps to reduce memory waste.
How to initialize 2D array?
The following example demonstrates how to initialize 2D array:
int arr[4][3]={{1,2,3},{2,3,4},{3,4,5},{4,5,6}};
How are 2D arrays stored in C?
A 2D array is stored one row after another in the computer's memory. The memory location of the entire 2D array is determined by the address of the first byte of memory.
Conclusion
In this article, we learned how to dynamically allocate a 2D array in C and saw its practical demonstration.
We hope that this blog has helped you enhance your knowledge regarding how to dynamically allocate a 2D array in C and if you would like to learn more about arrays & practice the same, check out the following problems based on array -
Do upvote our blog to help other ninjas grow. Happy Coding!