C Programming
About Lesson
1: malloc, calloc, realloc, and free Functions

Dynamic memory allocation in C allows you to allocate memory at runtime using functions like malloc, calloc, and realloc, and to free memory using free. These functions are used for managing memory dynamically.

  • malloc Function:

    • Allocates a block of memory of a specified size in bytes.
     
    #include <stdlib.h>

    int *ptr = (int *)malloc(5 * sizeof(int)); // Allocate memory for 5 integers
    if (ptr == NULL) {
    printf("Memory allocation failed.n");
    exit(1);
    }

  • calloc Function:

    • Allocates a block of memory for an array of elements, initialized to zero.
     
    int *ptr = (int *)calloc(5, sizeof(int)); // Allocate memory for 5 integers (initialized to zero)
    if (ptr == NULL) {
    printf("Memory allocation failed.n");
    exit(1);
    }
  • realloc Function:

    • Resizes the memory block previously allocated with malloc or calloc.
     
    int *new_ptr = (int *)realloc(ptr, 10 * sizeof(int)); // Resize memory for 10 integers
    if (new_ptr == NULL) {
    printf("Memory reallocation failed.n");
    free(ptr); // Free the original memory block
    exit(1);
    }
    ptr = new_ptr; // Update the pointer to the new memory block
  • free Function:

    • Releases the memory block allocated with malloc, calloc, or realloc.
    free(ptr); // Free the allocated memory block
2: Memory Leaks and Management Best Practices

Memory leaks occur when dynamically allocated memory is not properly deallocated, leading to memory wastage and potential performance issues. Follow these best practices to manage memory effectively:

  • Always Check Allocation Status:

    • Verify that memory allocation functions (malloc, calloc, realloc) return a valid pointer before using the allocated memory.
  • Free Allocated Memory:

    • Always release dynamically allocated memory using free when it’s no longer needed to prevent memory leaks.
  • Avoid Dangling Pointers:

    • Avoid using pointers that point to deallocated memory (dangling pointers), as they can lead to undefined behavior.
  • Use realloc with Caution:

    • Be cautious when using realloc to resize memory blocks. Always check the return value and handle potential allocation failures.
  • Debugging Tools:

    • Use memory debugging tools like Valgrind (on Unix-based systems) to detect memory leaks and issues during development and testing.
 3: Practice and Examples
  • Practice Exercise:
    • Write a program that dynamically allocates memory for an array of integers, initializes the array, and calculates its sum.
    • Implement a function that dynamically resizes an array based on user input (add or remove elements).
    • Develop a program that reads a string from the user, dynamically allocates memory to store it, and reverses the string in-place.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Function to dynamically allocate memory for an array of integers and calculate its sum
int dynamicArraySum(int size) {
int *arr = (int *)malloc(size * sizeof(int));
if (arr == NULL) {
printf("Memory allocation failed.n");
exit(1);
}

// Initialize array elements
for (int i = 0; i < size; i++) {
arr[i] = i + 1; // Initialize with values 1, 2, 3, ..., size
}

// Calculate sum of array elements
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}

// Free allocated memory
free(arr);

return sum;
}

int main() {
int size;
printf("Enter the size of the array: ");
scanf("%d", &size);

int sum = dynamicArraySum(size);
printf("Sum of array elements: %dn", sum);

return 0;
}

Dynamic memory allocation and management are essential skills for working with data structures and implementing flexible memory usage in C programs. Practice using malloc, calloc, realloc, and free functions effectively to avoid memory leaks and optimize memory usage. Understanding memory management principles will improve the reliability and performance of your C programs.