In C programming, memory management is a key aspect of efficient coding. Dynamic Memory Allocation (DMA) lets you allocate memory during runtime, giving your program the flexibility to handle variable-size data efficiently.
Let’s explore what DMA is, and how functions like malloc()
, calloc()
, realloc()
, and free()
work in real-world examples.
What is Dynamic Memory Allocation?
Dynamic Memory Allocation allows your program to request memory from the heap at runtime instead of using static memory size.
Useful when:
- The size of data structures is not known beforehand.
- You want to save memory by allocating only what’s needed.
DMA Functions in C
1. malloc()
– Memory Allocation
Allocates a block of memory of specified size (in bytes) and returns a pointer to the first byte.
int *ptr;
ptr = (int*) malloc(5 * sizeof(int)); // Allocates memory for 5 integers
Note: Contents of allocated memory are uninitialized.
2. calloc()
– Contiguous Allocation
Allocates memory for an array of elements and initializes all bytes to zero.
int *ptr;
ptr = (int*) calloc(5, sizeof(int)); // Allocates and initializes 5 integers
3. realloc()
– Reallocate Memory
Changes the size of previously allocated memory.
ptr = realloc(ptr, 10 * sizeof(int)); // Reallocates memory to hold 10 integers
4. free()
– Free Memory
Releases memory back to the system to avoid memory leaks.
free(ptr); // Always free dynamically allocated memory
Example Program Using malloc() and free()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n, i;
printf("Enter number of elements: ");
scanf("%d", &n);
arr = (int*) malloc(n * sizeof(int));
if (arr == NULL) {
printf("Memory not allocated.\n");
return 1;
}
printf("Enter elements:\n");
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
printf("You entered:\n");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
free(arr); // Important to prevent memory leaks
return 0;
}
malloc vs calloc Comparison
Feature | malloc() | calloc() |
---|---|---|
Initialization | No (garbage values) | Yes (all values zero) |
Syntax | malloc(size) | calloc(num, size) |
Speed | Slightly faster | Slightly slower |
Key Takeaways
- Use
malloc()
orcalloc()
to allocate memory dynamically. - Use
realloc()
to resize allocated memory. - Always use
free()
to release memory and avoid leaks. - Dynamic memory allocation is essential for building flexible and efficient programs.
Conclusion
Understanding dynamic memory allocation in C allows you to build scalable, memory-efficient applications. Whether it’s working with arrays, structures, or linked lists, using functions like malloc()
, calloc()
, and free()
is crucial for runtime memory control. Practice these concepts to improve your skills in system-level programming.