Добавляя пространство перед блоком памяти, а не после него, используя reallo c in C - PullRequest
1 голос
/ 27 апреля 2020

Я выделил массив символов и хочу добавить еще один символ в начале массива, сохраняя порядок.

Пример. Если указатель указывает на начало 4 блоков символов: A, B, C, D -> указатель [0] == A . Если я добавлю E, блок памяти должен выглядеть так: E, A, B, C, D -> указатель [0] == E .

Дополнительно я хочу это сделать в одной строке, без ручного копирования элементов в другой блок и удаления первого. Все функции должны быть из C стандартной библиотеки.

У меня есть что-то вроде pointer = reallo c (pointer-1, (n-1) * size) , но я не гарантирую, что указатель-1 свободен.

Спасибо за ваши ответы заранее

1 Ответ

1 голос
/ 27 апреля 2020

Добавление пространства перед блоком памяти, а не после него, используя reallo c

Перераспределить с помощью realloc(), а затем сдвинуть данные с помощью memove().

Я хочу сделать это в одну строку,

Либо используйте вспомогательную функцию, как показано ниже, либо используйте длинную трудную для чтения необслуживаемую строку.

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;
}

Пример использования. Для простоты примера обработка ошибок опущена.

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);
...