Вопрос простого вложенного указателя - PullRequest
0 голосов
/ 01 октября 2009

У меня есть такие структуры:

struct Child
{
  int foo;
  char bar[42];
};

struct Parent
{
   long foobar;
   struct Child ** children;
   size_t num_children;
}

Я определил API следующим образом:

struct Parent * ParentAlloc() { struct Parent* ptr = (struct Parent*)calloc(1, sizeof(struct Parent));
ptr->children = (struct Child**)calloc(SOME_NUMBER, sizeof(struct Child*));
return ptr;
}

Теперь, если я хочу удалить (ранее выделенный) дочерний элемент - при условии, что индекс не выходит за пределы:

void FreeChild(struct Parent* parent, const size_t index)
{
   free(parent->children[index]);

   //now I want to mark the address pointed to in the array of pointers as null, to mark it as available

   //I dont think I can do this (next line), since I have freed the pointer (its now "dangling")
   parent->children[index] = 0; // this is not right. How do I set this 'freed' address to null ?


}

Ответы [ 3 ]

2 голосов
/ 01 октября 2009

Конечно, вы можете сделать это. Указатель - это переменная, значением которой является адрес. Совершенно нормально, на самом деле хорошая практика, устанавливать указатели на 0 (или NULL) после вызова free, чтобы вы могли проверять их на ненулевое и избегать segfaults. Итог: ваш код в порядке.

2 голосов
/ 01 октября 2009

Нет проблем с установкой parent-> children [index] в NULL. Вы освободили только память, на которую указывает указатель, а не память, на которой хранится указатель.

0 голосов
/ 01 октября 2009

Вы смешиваете массив указателей с массивом структур. Удалить двойную звезду и работать со смещением:


...
struct Parent
{
  long foobar;
  struct Child* kids;
  size_t numkids;
};
...
struct Parent * ParentAlloc()
{
  struct Parent* ptr = ( struct Parent* )calloc( 1, sizeof( struct Parent ));
  ptr->kids = ( struct Child* )calloc( SOME_NUMBER, sizeof( struct Child ));
  ptr->numkids = SOME_NUMBER; /* don't forget this! */
  return ptr;
}
...
struct Child* GetChild( struct Parent* p, size_t index )
{
  assert( p );
  assert( index < p->numkids );
  return p->kids + index;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...