2015-08-15 2 views
1

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

Как и структура данных дерева, но вместо указателей слева и справа я хочу создать расширяемый массив, в котором я могу хранить много указателей. Есть ли способ сделать это?

struct Test{ 
    char label[100]; 
    float fear; 
    float anger; 
    float disgust; 
    float sad; 
    float happy; 
    float surprise; 
    struct Test *connect[]; 
}; 

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


Я попытался с помощью таНос, но мне кажется, что я не делаю это правильно, вот моя попытка:

ЬурейеЕ тест структура испытаний;

В функции (* tst) -> connect = malloc (sizeof (test));

+1

Он не кажется вам * необходимым * [гибким элементом массива] (https://en.wikipedia.org/wiki/Flexible_array_member). Я думаю, что достаточно просто 'size_t n_connect;' и 'struct Test ** connect;' членов. Очевидно, что некоторые команды 'calloc' и' realloc' будут поддерживать этих участников. – WhozCraig

ответ

0

Вам необходимо изучить malloc() и распределения памяти. В основном вы ищете

динамическое распределение памяти - выделение памяти на лету.

вместо статической памяти - выделение памяти во время компиляции

+0

Я пробовал malloc, но, похоже, я не могу найти правильный код для него. Я пробовал это: (* Tst) -> connect = malloc (sizeof (test)); Где «тест» - это typedef struct Test test; – Jeremy

+1

@Jeremy поставил вашу попытку в ваш вопрос в качестве дополнения – WhozCraig

+1

malloc означает выделение памяти и создаст место для хранения размером 1024 (например), если вы превзойдете это, вам понадобится realloc() больший фрагмент или malloc()) больше памяти и отслеживать ее. Как вы хотите это сделать, все зависит от вас, но reallac() намного проще для управления памятью. –

0

Вы можете использовать realloc() увеличить connect размер. Также используйте struct Test ** тип для него

+0

Сам по себе член 'connect' не может быть перераспределен с использованием' realloc', так как это [FAM] (https://en.wikipedia.org/wiki/Flexible_array_member). Тип 'struct Test **' позволит это, хотя и имеет другую семантику. – Jason

0

Когда у вас есть FAM в структуре, он выделяется встроенной структурой. Вам нужно realloc всю структуру для изменения размера connect.

Чтобы расширить немного, в вашей структуре

struct Test{ 
    char label[100]; 
    float fear; 
    float anger; 
    float disgust; 
    float sad; 
    float happy; 
    float surprise; 
    struct Test *connect[]; 
}; 

член connect является FAM. FAM позволяет вам распределять массив с переменным размером в строке со структурой. Это, как правило, необходимо, когда количество разметки указателя необходимо минимизировать. Однако это немного сложнее, чем простой указатель.

Чтобы realloc структура с FAM с дополнительной зарезервированной памяти, вызовите realloc следующим образом ...

test = realloc(test, sizeof(struct Test) + fam_cur_size + fam_add_size); 

Функция realloc консервирования существующие содержание, и даже повторно использовать один и тот же участок памяти, когда это возможно.

1

Вы уже определили, что вам нужно :)

struct Test{ 
    char label[100]; 
    float fear; 
    float anger; 
    float disgust; 
    float sad; 
    float happy; 
    float surprise; 
    struct Test *connect[]; 
}; 

Так все, что вам нужно выделить достаточно памяти для объекта типа Test.

Например

struct Test *objext = malloc(sizeof(struct Test) + 10 * sizeof(struct Test *)); 

элемент данных connect называется гибкий элемент массива.

Только вы хотите, чтобы вы добавили еще один элемент данных, который будет содержать количество элементов в массиве.

+0

Не понимаю, что он будет делать с '+ 10 * sizeof (struct Test *)' memory? Он должен выполнить второе распределение, например: 'objext-> connect = malloc (10 * sizeof (struct Test *))'. – i486

+0

@ i486 Он будет хранить там свои указатели на другие объекты типа Test. –

+0

Хорошо, я понял эту идею. Я предположил, что 'connect' является двойным указателем. Если автор хочет динамически расширяемый член 'connect', он должен быть определен как' struct Test ** connect; ', и размер объекта Test будет исправлен. – i486

Смежные вопросы