Указатель лучшей практики - PullRequest
4 голосов
/ 22 июля 2010

Я только начинаю изучать C и (конечно) борюсь с указателями:)

Учитывая этот фрагмент:

int *storage, *storage_p;
storage = malloc(sizeof(int[GROW_BY]));
storage_p = storage;
// do something with storage, using storage_p
free(storage);
storage = NULL;

Действительно ли необходимо объявить две переменные для работы с malloc() 'данными? Это хорошая практика для создания storage и storage_p, как я сделал? Если нет, то каким был бы «путь»?

Ответы [ 7 ]

3 голосов
/ 22 июля 2010

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

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

Однако я обычно сохраняю чистый начальный указатель и создаю новые, специальные, по мере необходимости.

int *storage = (int*) malloc(sizeof(int[GROW_BY])); 
// :
int* ptr = storage;
while (*ptr)
{
  // :
  ++ptr;
}
2 голосов
/ 22 июля 2010

Я бы продублировал указатель, созданный malloc только по одной причине: я хочу изменить его.

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

Также, когда дело доходит до динамического распределения, взгляните на свободные списки, они значительно упрощают:

http://en.wikipedia.org/wiki/Free_list

1 голос
/ 22 июля 2010

Причина, по которой вы можете захотеть это сделать, заключается в том, что после нескольких манипуляций с storage вы можете не помнить, что нужно free().Наличие копии storage_p, которую вы никогда не изменяете, помогает предотвратить утечки памяти, потому что вы можете позвонить free(storage_p) позже, независимо от того, что случилось с storage.Перевесит ли это уже упомянутые недостатки, зависит от деталей ситуации.

Пример:

int *storage;
storage = malloc(sizeof(int[GROW_BY]));
storage++;
free(storage); //SEGFAULT or MEMORY LEAK or OTHER BAD STUFF
storage = NULL;

против

int *storage, *storage_p;
storage = malloc(sizeof(int[GROW_BY]));
storage_p = storage;
storage++;
free(storage_p);
storage_p=NULL;
storage = NULL;
1 голос
/ 22 июля 2010

Нет, я не вижу, где вы получили что-то, имея storage и storage_p.Обычно у меня есть только один из них.

1 голос
/ 22 июля 2010

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

Gool 'ol:

int *storage = malloc(size_of_whatever);
storage[0] = do_something();
free(storage);
storage = NULL;

было бы хорошо.

0 голосов
/ 28 июня 2017

Нет внутренней причины переназначать пространство, которое было malloc, другому указателю.

Во всяком случае, это просто добавит лишние строки и ухудшит удобочитаемость.

0 голосов
/ 22 июля 2010

Это кажется мне ненужным.Я не уверен, какой может быть средняя секция, но я не вижу никакой выгоды в том, чтобы совмещать такие указатели - если вы не изменяете storage_p (например, увеличивая его для повторения).Фактически наличие двух указателей с псевдонимами может затруднить отслеживание выделенной памяти.

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