Sobes.tech
Junior

What needs to be done for array elements to move when using realloc?

sobes.tech AI

Answer from AI

When using realloc, there is no direct mechanism that forces array elements to move. realloc attempts to expand or [shrink] the existing memory block. If possible (enough space nearby), it simply resizes it. If not — it allocates a new block, copies the old content there, and frees the old one.

To guarantee a "move" (meaning the data ends up in a new location), you can use the following approach:

  1. Allocate new memory using malloc.
  2. Copy data from the old block to the new one.
  3. Free the old block using free.

This essentially mimics the behavior of realloc when it cannot expand the existing block.

Example:

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

int main() {
    int *arr;
    int old_size = 3;
    int new_size = 5;

    // Allocate initial memory
    arr = (int *)malloc(old_size * sizeof(int));
    if (arr == NULL) {
        perror("Error allocating initial memory");
        return 1;
    }

    // Fill the initial array
    for (int i = 0; i < old_size; i++) {
        arr[i] = i + 1;
        printf("%d ", arr[i]);
    }
    printf("\n");

    // Mimic "move"
    int *new_arr;
    // 1. Allocate new memory
    new_arr = (int *)malloc(new_size * sizeof(int));
    if (new_arr == NULL) {
        perror("Error allocating new memory for transfer");
        free(arr); // Free old memory before exit
        return 1;
    }

    // 2. Copy data
    memcpy(new_arr, arr, old_size * sizeof(int));

    // 3. Free old block
    free(arr);

    // Now arr points to freed memory,
    // use new_arr for the new block.
    arr = new_arr; // Redirect pointer (optional, but convenient)

    // Fill the new array
    for (int i = old_size; i < new_size; i++) {
        arr[i] = i + 10;
    }

    // Print the new array
    for (int i = 0; i < new_size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // Free the new memory
    free(arr);

    return 0;
}

In this example, we explicitly allocate new memory, copy the old array's contents, and free the old memory. This guarantees that the data ends up in a new location, which realloc does not guarantee. realloc itself decides whether to reallocate with copying or just extend the existing block.