Examples of Segmentation Fault in Dynamic Memory Allocation

Explore practical examples of segmentation faults caused by dynamic memory allocation errors.
By Jamie

Understanding Segmentation Faults in Dynamic Memory Allocation

Segmentation faults are a common error encountered in programming, particularly when dealing with dynamic memory allocation in languages like C and C++. A segmentation fault occurs when a program attempts to access a memory segment that it’s not allowed to access, which often results from improper handling of memory. Below are three practical examples that illustrate this issue in various contexts.

Example 1: Accessing Uninitialized Memory

Context

In C programming, failing to initialize a pointer before use can lead to a segmentation fault. This often happens in dynamic memory allocation when a pointer is declared but not initialized properly.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr; // Pointer declared but not initialized

    *ptr = 10; // Attempting to dereference an uninitialized pointer
    printf("Value: %d\n", *ptr);
    return 0;
}

Notes

In this example, the pointer ptr is declared but not assigned any memory location through functions like malloc. Dereferencing it results in a segmentation fault because it points to an arbitrary memory location. To fix this, always initialize pointers properly before dereferencing them.

Example 2: Buffer Overflow in Dynamic Array

Context

Dynamic arrays can lead to segmentation faults if the program writes beyond the allocated memory. This often occurs when the array’s bounds are not properly checked.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = (int *)malloc(5 * sizeof(int)); // Allocate memory for 5 integers
    for (int i = 0; i <= 5; i++) { // Incorrect loop condition
        arr[i] = i; // Writing beyond allocated memory
    }
    free(arr);
    return 0;
}

Notes

In this case, the loop condition i <= 5 causes the program to write to arr[5], which is out of bounds for the allocated memory (0 to 4). This results in a segmentation fault. To prevent this error, ensure that the loop condition strictly adheres to the allocated size.

Example 3: Double Free Error

Context

Double freeing memory can also result in segmentation faults. This occurs when a program attempts to free the same memory allocation more than once.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(sizeof(int)); // Allocate memory

    *ptr = 10;
    free(ptr); // First free
    free(ptr); // Second free - causes segmentation fault
    return 0;
}

Notes

Here, after the first free(ptr), the pointer ptr still points to the deallocated memory. The second free(ptr) results in a segmentation fault because the memory has already been freed. To prevent this, set the pointer to NULL after freeing it, ensuring that any subsequent free calls do not affect it.

By understanding these examples of segmentation fault in dynamic memory allocation, programmers can take preventative measures to avoid such errors in their code. Proper memory management is essential for creating robust and error-free applications.