Suppose I have the following:
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 is similar to an array and void *list is supposed to store the elements or pointers to the elements. Mystruct *InitStruct is a function that initializes a Mystruct pointer and void *Retrieve is a function that returns a pointer to the element stored at a given index.
First, how should I initialize void* list? Should it hold the actual elements or be an array of pointers pointing to the elements?
Second, using the void *Retrieve function, how do I return a pointer to the element stored at a given index in my->list?
On the first point, if all elements are the same size, as that
itemSizename suggests, then adding one level of indirection (havinglistpoint to pointers to items, rather than to items directly) seems to have no added value, so I’d usemy->list = malloc(count * itemSize);.On the second point,
(char*)my->list + itemSize*indexshould work. You may first want to check thatindex < my->count, of course (maybe you want to returnNULLin that case rather than an invalid pointer).