Aleksa Racic
Aleksa Racic

Reputation: 17

Adding space before the memory block rather than after it using realloc in C

I have allocated an array of chars and I want to add another char at the beginning of the array while maintaining the order.

Ex. If pointer points to the beginning of 4 char blocks: A,B,C,D -> pointer[0]==A . If I add E the block of memory should look: E,A,B,C,D -> pointer[0]==E.

Additionally I want to do it in one line, without manually copying elements to another block and erasing the first. All functions have to be from C standard library.

I have though of something like pointer = realloc(pointer-1, (n-1)*size), but I'm not guaranteed that pointer-1 is free.

Thankful for your answers in advance

Upvotes: 1

Views: 353

Answers (1)

chux
chux

Reputation: 153592

Adding space before the memory block rather than after it using realloc

Re-allocate with realloc() and then shift the data with memove().

I want to do it in one line,

Either use a helper function like below or employ a long hard to read un-maintainable line.

char *realloc_one_more_in_front(char *ptr, size_t current_size) {
  void *new_ptr = realloc(ptr, sizeof *ptr * (current_size + 1));
  if (new_ptr == NULL) {
    return NULL; // Failure to re-allocate.
  }
  ptr = new_ptr;
  memmove(ptr + 1, ptr, sizeof *ptr * current_size);
  return ptr;
}

Sample usage. For simplicity of example, error handling omitted.

size_t current_size = 4;
char *ptr = malloc(current_size);
for (size_t i = 0 ; i<current_size; i++) {
  ptr[i] = 'A' + i;
}

ptr = realloc_one_more_in_front(ptr, current_size++);
ptr[0] = 'E';

printf("%.*s\n", (int) current_size, ptr);

Upvotes: 1

Related Questions