Dynamic memory allocation
Dynamic Memory Allocation Functions
1. malloc
malloc (memory allocation) allocates a specified number of bytes of memory and returns a pointer to the beginning of the allocated block.
Syntax:
void *malloc(size_t size);size: Number of bytes to allocate.
Example:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(5 * sizeof(int)); // Allocate memory for 5 integers
if (arr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Use the allocated memory
for (int i = 0; i < 5; i++) {
arr[i] = i * 10;
printf("%d ", arr[i]); // Outputs: 0 10 20 30 40
}
free(arr); // Free the allocated memory
return 0;
}2. calloc
calloc (contiguous allocation) allocates memory for an array of elements, initializes all bytes to zero, and returns a pointer.
Syntax:
void *calloc(size_t num, size_t size);num: Number of elements.size: Size of each element in bytes.
Example:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)calloc(5, sizeof(int)); // Allocate and initialize memory for 5 integers
if (arr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Use the allocated memory
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]); // Outputs: 0 0 0 0 0 (all initialized to 0)
}
free(arr); // Free the allocated memory
return 0;
}3. realloc
realloc (reallocation) changes the size of a previously allocated memory block. It may move the block to a new location.
Syntax:
void *realloc(void *ptr, size_t newSize);ptr: Pointer to the previously allocated memory block.newSize: New size in bytes.
Example:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(5 * sizeof(int)); // Allocate memory for 5 integers
if (arr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
for (int i = 0; i < 5; i++) {
arr[i] = i * 10;
}
// Resize the memory block to hold 10 integers
arr = (int *)realloc(arr, 10 * sizeof(int));
if (arr == NULL) {
printf("Memory reallocation failed\n");
return 1;
}
for (int i = 5; i < 10; i++) {
arr[i] = i * 10;
}
// Use the resized memory
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]); // Outputs: 0 10 20 30 40 50 60 70 80 90
}
free(arr); // Free the allocated memory
return 0;
}4. free
free releases a block of memory previously allocated by malloc, calloc, or realloc.
Syntax:
void free(void *ptr);ptr: Pointer to the memory block to be freed.
Example:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(5 * sizeof(int)); // Allocate memory for 5 integers
if (arr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Free the allocated memory
free(arr);
return 0;
}Dynamic Arrays
Dynamic arrays are arrays whose size can be adjusted at runtime using the above memory allocation functions.
Example: Dynamic Array Creation and Resizing
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(3 * sizeof(int)); // Allocate memory for 3 integers
if (arr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Initialize the array
for (int i = 0; i < 3; i++) {
arr[i] = i + 1;
}
// Resize the array to hold 6 integers
arr = (int *)realloc(arr, 6 * sizeof(int));
if (arr == NULL) {
printf("Memory reallocation failed\n");
return 1;
}
// Initialize the new elements
for (int i = 3; i < 6; i++) {
arr[i] = i + 1;
}
// Use the dynamic array
for (int i = 0; i < 6; i++) {
printf("%d ", arr[i]); // Outputs: 1 2 3 4 5 6
}
free(arr); // Free the allocated memory
return 0;
}Explanation:
Allocate:
mallocallocates initial memory for 3 integers.Resize:
reallocincreases the array size to 6 integers.Use: Initialize and access the dynamic array elements.
Free:
freereleases the memory when done.
Summary
malloc: Allocates memory.calloc: Allocates and initializes memory.realloc: Resizes previously allocated memory.free: Releases allocated memory.Dynamic Arrays: Created and resized at runtime using these functions.
Last updated
Was this helpful?