2010-11-15 3 views
1

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

+2

Это было бы намного легче ответить, если бы вы уточнили вопрос с помощью некоторого кода, демонстрирующего то, чего вы пытаетесь достичь. –

ответ

6

Ваш вопрос не ужасающе ясно, но ...

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

Однако система не будет звонить 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 - с объявления переменных, где я хочу их.)

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

+0

Я вижу. Спасибо. –

+0

Итак, вы не перераспределяете раздел, но вы перераспределяете разделы? Поэтому мне интересно, если вместо –

+0

struct section * section = & sections [num_sections ++]; можете ли вы сделать еще один realloc? Предполагая, что у вас есть malloc. –