Initialize void pointer to point to an array
Suppose I have the following:
typedef struct {
int itemSize;
int count;
void *list;
} Mystruct;
Mystruct *In开发者_运维技巧itStruct(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 itemSize
name suggests, then adding one level of indirection (having list
point to pointers to items, rather than to items directly) seems to have no added value, so I'd use my->list = malloc(count * itemSize);
.
On the second point, (char*)my->list + itemSize*index
should work. You may first want to check that index < my->count
, of course (maybe you want to return NULL
in that case rather than an invalid pointer).
精彩评论