
What is Dynamic Memory Allocation in C ?
Dynamic memory allocation in C refers to the process of allocating memory during runtime, allowing the program to request and release memory as needed. This is done using functions provided by the C standard library, such as malloc, calloc, realloc, and free.
Here’s a table summarizing the different types of dynamic memory allocation:
| Sr. No. | Memory Allocation Type | Information | Additional Information |
|---|---|---|---|
| 1 | malloc | Allocates a block of memory | The allocated memory is not initialized |
| 2 | calloc | Allocates and initializes a block of memory | Memory is initialized to zero |
| 3 | realloc | Resizes a previously allocated block of memory | Can be used to increase or decrease the size of the memory block |
| 4 | free | Releases the allocated memory | Should always be called to avoid memory leaks |
1. malloc in C
malloc stands for “memory allocation.” It is used to allocate a specified amount of memory in bytes.
Example:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Access and modify allocated memory
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
// Print the allocated memory
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
free(ptr);
return 0;
}Output:
1 2 3 4 5Explanation:
The malloc function is used to allocate a specified amount of memory in bytes. In this example, we allocate memory for an array of 5 integers.
Code Explanation:
- We include the necessary header files,
stdio.hfor input/output operations andstdlib.hfor memory allocation functions. - Inside the
mainfunction, we declare a pointerptrof typeint*. - We use
mallocto allocate memory for 5 integers (5 * sizeof(int)bytes) and assign the returned memory address toptr. - We check if the memory allocation was successful by comparing
ptrwithNULL. IfptrisNULL, it means the allocation failed, and we print an error message and return from the program. - We use a loop to access and modify the allocated memory, assigning values 1 to 5 to each element of the array.
- Finally, we print the contents of the allocated memory using another loop.
- We release the allocated memory using
free(ptr)to avoid memory leaks.
2. calloc in C
calloc stands for “contiguous allocation.” It is used to allocate memory and initialize all the bytes to zero.
Example:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)calloc(5, sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Print the allocated memory
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
free(ptr);
return 0;
}Output:
0 0 0 0 0Explanation:
The calloc function is used to allocate memory and initialize all the bytes to zero. In this example, we allocate memory for an array of 5 integers.
Code Explanation:
- We include the necessary header files,
stdio.hfor input/output operations andstdlib.hfor memory allocation functions. - Inside the
mainfunction, we declare a pointerptrof typeint*. - We use
callocto allocate memory for 5 integers (5 * sizeof(int)bytes) and assign the returned memory address toptr. - We check if the memory allocation was successful by comparing
ptrwithNULL. IfptrisNULL, it means the allocation failed, and we print an error message and return from the program. - We print the contents of the allocated memory using a loop. Since
callocinitializes the memory to zero, all the elements of the array will be printed as 0. - We release the allocated memory using
free(ptr)to avoid memory leaks.
3. realloc in C
realloc stands for “reallocate.” It is used to resize a previously allocated block of memory.
Example:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Access and modify initial memory
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
// Resize the memory to hold 8 integers
ptr = (int*)realloc(ptr, 8 * sizeof(int));
// Access and modify the resized memory
for (int i = 5; i < 8; i++) {
ptr[i] = i + 1;
}
// Print the allocated memory
for (int i = 0; i < 8; i++) {
printf("%d ", ptr[i]);
}
free(ptr);
return 0;
}Output:
1 2 3 4 5 6 7 8Explanation:
The realloc function is used to resize a previously allocated block of memory. In this example, we allocate memory for 5 integers and then resize it to hold 8 integers.
Code Explanation:
- We include the necessary header files,
stdio.hfor input/output operations andstdlib.hfor memory allocation functions. - Inside the
mainfunction, we declare a pointerptrof typeint*. - We use
mallocto allocate memory for 5 integers (5 * sizeof(int)bytes) and assign the returned memory address toptr. - We check if the memory allocation was successful by comparing
ptrwithNULL. IfptrisNULL, it means the allocation failed, and we print an error message and return from the program. - We use a loop to access and modify the initial allocated memory, assigning values 1 to 5 to each element of the array.
- We use
reallocto resize the memory block pointed to byptrto hold 8 integers (8 * sizeof(int)bytes). Theptris updated with the new memory address if the reallocation is successful. - We use another loop to access and modify the resized memory, assigning values 6 to 8 to the additional elements of the array.
- Finally, we print the contents of the allocated memory using a loop.
- We release the allocated memory using
free(ptr)to avoid memory leaks.
4. free in C
free is used to release the memory previously allocated using malloc, calloc, or realloc. It is important to free memory to avoid memory leaks.
Example:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Access and modify allocated memory
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
// Print the allocated memory
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
free(ptr); // Release the allocated memory
return 0;
}Output:
1 2 3 4 5Explanation:
The free function is used to release the memory previously allocated using malloc, calloc, or realloc. It is important to free memory to avoid memory leaks.
Code Explanation:
- We include the necessary header files,
stdio.hfor input/output operations andstdlib.hfor memory allocation functions. - Inside the
mainfunction, we declare a pointerptrof typeint*. - We use
mallocto allocate memory for 5 integers (5 * sizeof(int)bytes) and assign the returned memory address toptr. - We check if the memory allocation was successful by comparing
ptrwithNULL. IfptrisNULL, it means the allocation failed, and we print an error message and return from the program. - We use a loop to access and modify the allocated memory, assigning values 1 to 5 to each element of the array.
- Finally, we print the contents of the allocated memory using a loop.
- We release the allocated memory using
free(ptr)to avoid memory leaks.
Complex example of dynamic memory allocation in C
The example below demonstrates how dynamic memory allocation can be used to create a flexible and scalable solution for managing employee data. The program allows the user to input any number of employees and stores their information dynamically.
Example:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
char name[50];
float salary;
} Employee;
int main() {
int numEmployees;
printf("Enter the number of employees: ");
scanf("%d", &numEmployees);
// Dynamically allocate memory for an array of Employee structs
Employee* employees = (Employee*)malloc(numEmployees * sizeof(Employee));
if (employees == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Read employee details from the user
for (int i = 0; i < numEmployees; i++) {
printf("\nEnter details for Employee %d:\n", i + 1);
printf("ID: ");
scanf("%d", &(employees[i].id));
printf("Name: ");
scanf("%s", employees[i].name);
printf("Salary: ");
scanf("%f", &(employees[i].salary));
}
// Print the employee details
printf("\nEmployee Details:\n");
for (int i = 0; i < numEmployees; i++) {
printf("ID: %d, Name: %s, Salary: %.2f\n",
employees[i].id, employees[i].name, employees[i].salary);
}
// Free the allocated memory
free(employees);
return 0;
}Output:
Enter the number of employees: 2
Enter details for Employee 1:
ID: 301
Name: Jigglypuff
Salary: 4
Enter details for Employee 2:
ID: 302
Name: Dragonite
Salary: 6
Employee Details:
ID: 301, Name: Jigglypuff, Salary: 4.00
ID: 302, Name: Dragonite, Salary: 6.00Explanation:
- We include the necessary header files,
stdio.hfor input/output operations andstdlib.hfor memory allocation functions. - We define a
structcalledEmployeeto represent the information of an employee. - Inside the
mainfunction, we declare a variablenumEmployeesto store the number of employees to be entered by the user. - We prompt the user to enter the number of employees using
printfand read the input usingscanf. - We use
mallocto dynamically allocate memory for an array ofEmployeestructs, based on the number of employees entered by the user. - We check if the memory allocation was successful by comparing
employeeswithNULL. IfemployeesisNULL, it means the allocation failed, and we print an error message and return from the program. - We use a loop to read the details of each employee from the user, including their ID, name, and salary. The data is stored in the dynamically allocated memory.
- After reading all the employee details, we use another loop to print the details of each employee.
- Finally, we free the allocated memory using
free(employees)to ensure proper deallocation and prevent memory leaks.