Инициализируйте пустой указатель, чтобы указать на массив - PullRequest
1 голос
/ 24 апреля 2010

Предположим, у меня есть следующее:

typedef struct {
   int itemSize;
   int count;
   void *list;
} Mystruct;

Mystruct *InitStruct(int itemSize, int count) 
{
  Mystruct *my = malloc(sizeof(Mystruct));
  my->itemSize = itemSize;
  my->count = count;
  //What is the best way to initialize list?  For example:
  //my->list = malloc(count * sizeof(void *));   OR
  //my->list = malloc(count * sizeof(itemSize));
}

//The following should return a pointer to the element stored at a given index 
void *Retrieve(const MyStruct *my, int index)
{
   void *item;
   //What is the best way to return a pointer to the item at the given index from 
   //my->list?
}

Mystruct похож на массив, а список void * должен хранить элементы или указатели на элементы. Mystruct * InitStruct - это функция, которая инициализирует указатель Mystruct, а void * Retrieve - это функция, которая возвращает указатель на элемент, хранящийся в данном индексе.

Во-первых, как мне инициализировать список void *? Должно ли оно содержать фактические элементы или быть массивом указателей, указывающих на элементы?

Во-вторых, с помощью функции void * Retrieve, как мне вернуть указатель на элемент, сохраненный по указанному индексу в my-> list?

1 Ответ

1 голос
/ 24 апреля 2010

По первому пункту, если все элементы имеют одинаковый размер, как предполагает имя itemSize, то добавление одного уровня косвенности (имеющего list указатель на указатели на элементы, а не на элементы напрямую), похоже, имеет нет добавленной стоимости, поэтому я бы использовал my->list = malloc(count * itemSize);.

По второму пункту (char*)my->list + itemSize*index должно работать. Вы, возможно, сначала захотите проверить это index < my->count, конечно (возможно, вы хотите вернуть NULL в этом случае, а не неверный указатель).

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