Изменение размера массива с помощью C

Мне нужно иметь массив структур в игре, которую я делаю, но я не хочу ограничивать массив фиксированным размером. Мне сказали, что есть способ использовать realloc, чтобы сделать массив больше, когда это необходимо, но не может найти никаких рабочих примеров этого.

Может кто-нибудь, пожалуйста, покажите мне, как это сделать?

Ответы

Ответ 1

Начните с создания массива:

structName ** sarray = (structName **) malloc(0 * sizeof(structName *));

Всегда отслеживайте размер отдельно:

size_t sarray_len = 0;

Чтобы увеличить или усечь:

sarray = (structName **) realloc(sarray, (sarray_len + offset) * sizeof(structName *));

Затем установите размер:

sarray_len += offset;

С удовольствием помогаем и надеемся, что это поможет.

Ответ 2

Функция realloc может использоваться для выращивания или сжатия массива. Когда массив растет, существующие записи сохраняют свое значение, а новые записи не инициализируются. Это может либо расти на месте, либо если это невозможно, он может выделить новый блок в другом месте в памяти (и за кулисами, скопировать все значения в новый блок и освободить старый блок).

Самая простая форма:

// array initially empty
T *ptr = NULL;

// change the size of the array
ptr = realloc( ptr, new_element_count * sizeof *ptr );

if ( ptr == NULL )
{
    exit(EXIT_FAILURE);
}

Умножение происходит потому, что realloc ожидает несколько байтов, но вы всегда хотите, чтобы ваш массив имел правильное количество элементов. Обратите внимание, что этот шаблон для realloc означает, что вам не нужно повторять T в любом месте вашего кода, кроме исходного объявления ptr.

Если вы хотите, чтобы ваша программа могла восстановиться из отказа распределения, вместо выполнения exit, вам нужно сохранить старый указатель вместо того, чтобы перезаписать его с помощью NULL:

T *new = realloc( ptr, new_element_count * sizeof *ptr );

if ( new == NULL )
{
    // do some error handling; it is still safe to keep using
    // ptr with the old element count
}
else
{
    ptr = new;
}

Обратите внимание, что сокращение массива с помощью realloc может фактически не вернуть память в операционную систему; память может продолжать принадлежать вашему процессу и доступна для будущих вызовов malloc или realloc.

Ответ 3

От http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

/* realloc example: rememb-o-matic */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
  int input,n;
  int count=0;
  int * numbers = NULL;

  do {
     printf ("Enter an integer value (0 to end): ");
     scanf ("%d", &input);
     count++;
     numbers = (int*) realloc (numbers, count * sizeof(int));
     if (numbers==NULL)
       { puts ("Error (re)allocating memory"); exit (1); }
     numbers[count-1]=input;
  } while (input!=0);

  printf ("Numbers entered: ");
  for (n=0;n<count;n++) printf ("%d ",numbers[n]);
  free (numbers);

  return 0;
}