реаллок внутри реаллока - PullRequest
1 голос
/ 15 ноября 2010

В C вы можете иметь realloc внутри realloc?Например, структура внутри структуры, когда вам нужно распределить их по обе стороны и перераспределить их обе.Если да, может кто-нибудь привести простой пример?Заранее спасибо.

1 Ответ

6 голосов
/ 15 ноября 2010

Ваш вопрос не до конца понятен, но ...

Да, данная динамически распределенная структура (например, массив структур) сама может содержать указатели на распределенные данные (например, различные другие массивывыделенные структуры), и вы можете перераспределить различные части независимо.

Однако система не будет вызывать realloc() для вас, пока вы перераспределяете одну из структур;вам придется отдельно программировать различные операции изменения размера.

Пример вложенных структур данных:

struct line { char *info; size_t length; };

struct section { size_t num_lines; struct line *lines; };

Вы можете выделить массив секций и перераспределить этот массив при необходимости.Каждый раздел содержит массив строк, и каждый из этих массивов строк также может быть независимо перераспределен.


Следовательно:

size_t num_sections = 0;
size_t max_sections = 0;
struct section *sections = 0;

if (num_sections == max_sections)
{
     size_t new_max = (max_sections + 1) * 2;
     struct section *new_sections;
     if (sections == 0)
         new_sections = malloc(new_max * sizeof(*new_sections));
     else
         new_sections = realloc(sections, new_max * sizeof(*new_sections));
     if (new_sections == 0)
         ...out of memory error...
     sections = new_sections;
     max_sections = new_max;
 }
 struct section *section = &sections[num_sections++];  // Newly available section
 section->num_lines = 0;
 section->lines = 0;
 return section;

(я предполагаю C99 - с переменнойобъявления, где я хочу их.)

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

...