двойной указатель и структуры - PullRequest
1 голос
/ 26 ноября 2009

Я почти уверен, что не делаю ничего плохого, но все равно решил спросить.

У нас есть:

struct some_struct **array_of_ptrs = calloc (num, sizeof (struct some_struct*));

Теперь предположим, что я просто указываю каждому из этих указателей в массиве на struct some_struct. Теперь обязательно, чтобы освободить память, я просто делаю:

free (array_of_ptrs);

Конечно, это вполне приемлемо? Причина, по которой я спрашиваю, заключается в том, что я делаю нечто похожее в своем коде, а gdb жалуется на бесплатную ошибку.

Ответы [ 4 ]

2 голосов
/ 26 ноября 2009

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

Также помните, что вы можете назначить от array_of_ptrs[0] до array_of_ptrs[num-1]. Если вы назначите array_of_ptrs[num], у вас проблемы.

0 голосов
/ 27 ноября 2009

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

Что касается ошибки, какую версию gcc вы используете? Я протестировал код на 4.3.3, и он без проблем компилируется, даже с -Wall -pedantic.

0 голосов
/ 26 ноября 2009

Если вы сделаете

free(array_of_ptrs);
, то у вас возникнет утечка памяти, так как каждая запись имеет указатель в этом массиве указателей, поэтому вам стоит потратить
free(...);
на каждый указатель, который у вас есть malloc ' d, а затем выпустить окончательный
free(array_of_ptrs);
. Это очень похоже на работу со связанным списком с использованием указателей
while (!*array_of_ptrs){
 struct *some_ptr_to_struct = *array_of_ptr;
 free(some_ptr_to_struct);
 *array_of_ptrs++;
}
free(array_of_ptrs);

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 26 ноября 2009

Да, то, что вы здесь делаете, выглядит правильно. Вы выделяете массив num указателей. Итак, предполагая 4-байтовый указатель, 4 * num байта, все инициализируются в ноль. Если вы затем назначите их каждому другому указателю, это не создаст проблемы, когда вы free список указателей.

На что именно жалуется GDB? Может ли это жаловаться на то, что эти указатели указывают на освобождение? Освобождение списка указателей не освободит то, на что они каждый указывают, если сами фактические структуры были выделены динамически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...