Объявление динамического массива в C? - PullRequest
1 голос
/ 13 ноября 2011

У меня есть структура PACKET, которая содержит два поля int. Как бы я объявил динамический массив ПАКЕТОВ? Я буду добавлять в массив неизвестное количество раз в основном ... поэтому мне нужно, чтобы он был динамического размера.

Ответы [ 4 ]

2 голосов
/ 13 ноября 2011

В зависимости от среды, которую вы используете, у вас есть следующие опции:

  1. Реализация массива с изменяемыми размерами, используя malloc и realloc
  2. Используйте GArray или GList тип данных из GNOME
  3. Переключитесь на C ++ и используйте std::vector<PACKET>
  4. Переключитесь на Java и используйте ArrayList
  5. Найдите другую библиотеку, которая предоставляет нужную вам функцию

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

1 голос
/ 14 ноября 2011

Инкапсулируйте реализацию динамического массива с помощью malloc / realloc в паре файлов .h / .c для более легкого использования.

static int length = 0;

PACKET *dynamic_array_put(PACKET *list, const PACKET new) {
  PACKET *ret_val = NULL;

  ret_val = realloc(list, sizeof(PACKET) * (length + 1));

  if (ret_val == NULL) {
    /* Not enough memory */
    return NULL;
  }

  memmove(list + length, &new, sizeof(PACKET));
  length++;

  return ret_val;
}

PACKET *dynamic_array_get(PACKET *list, int index) {
  PACKET *p = NULL;

  p = malloc(sizeof(PACKET));
  if (p == NULL) {
    /* Not enough memory */
    return NULL;
  }

  memmove(p, list + index, sizeof(PACKET));

  return p;
}

PACKET *dynamic_array_remove(PACKET *list, int index) {
  PACKET *ret_val = NULL;
  PACKET tmp;

  memmove(&tmp, list + index, sizeof(PACKET));
  memmove(list + index, list + index + 1, 
          sizeof(PACKET) * (list - index - 1));

  ret_val = realloc(list, sizeof(PACKET) * (list - 1));
  if (ret_val == NULL) {
    /* Not enough memory, restore! */
    memmove(list + index + 1, list + index, 
            sizeof(PACKET) * (list - index - 1));
    memmove(list + index, &tmp, sizeof(PACKET));
    return NULL;
  }

  length--;

  return ret_val;
}

Если пространство памяти не является проблемой, вы можете распределять память по блокам,вместо каждого добавления ПАКЕТОВ и ускорить среднее добавление.

1 голос
/ 13 ноября 2011

Ознакомьтесь с malloc и realloc - вот какой-то пример / небольшой учебник:

http://fydo.net/gamedev/dynamic-arrays

Вот более подробное объяснение:

http://www.cse.unt.edu/~donr/courses/4410/dynamicArrays/dynamicArrays.html

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

0 голосов
/ 13 ноября 2011

Нет динамического массива, встроенного в C, у вас есть несколько вариантов. Один Создайте некоторый тип связанного хранилища, другой должен использовать статический массив и перераспределение по мере необходимости, но вы должны сами управлять хранилищем. Возьми лок realloc

...