C: Insérer / obtenir un élément dans / à partir d’un tableau vide

Je dois créer un tableau générique pouvant contenir des structures de données génériques. Comment puis-je mettre une structure générique dans un emplacement vide de mon tableau vide?

Ceci est mon code.

struct CircularBuffer { int E; int S; int length; // total number of item allowable in the buffer int sizeOfType; // size of each element in the buffer void *buffer; }; struct CircularBuffer* circularBufferInit(int length, int sizeOfType) { struct CircularBuffer *cb = malloc(sizeof(struct CircularBuffer)); cb->E = 0; cb->S = 0; cb->length = length; cb->sizeOfType = sizeOfType; cb->buffer = malloc(sizeOfType *length); return cb; } int circularBufferIsEmpty(struct CircularBuffer* cb) { if (cb->S == cb->E) return 1; //empty else return 0; } int circularBufferIsFull(struct CircularBuffer *cb) { int nE = (cb->E + 1) % (cb->length); if (nE == cb->S) return 1; //full else return 0; } void circularBufferAdd(struct CircularBuffer *cb, void* obj) { memcpy(cb->buffer + cb->E, obj, cb->sizeOfType); } [...] 

memcpy est le problème …

Il semble qu’essentiellement, vous essayez de comprendre comment compenser un void * par l’adresse d’un élément de tableau de taille connue mais de type inconnu afin que vous puissiez le transmettre à memcpy() .

Il semble que dans circularBufferAdd() , cb->E donne l’indice de l’élément que vous voulez copier, cb->buffer est le void * du tableau, obj est l’élément à copier et cb->sizeOfType est la taille de chaque élément du tableau (et obj ). Dans ce cas, vous pouvez changer:

  memcpy(cb->buffer + cb->E, obj, cb->sizeOfType); 

à:

  memcpy((char *)cb->buffer + (cb->E * cb->sizeOfType), obj, cb->sizeOfType); 

Étant donné que vous ne pouvez pas utiliser l’arithmétique de pointeur avec un void * , vous devez le lancer en caractères char * . Ensuite, vous pouvez multiplier l’index de l’élément par la taille de l’élément pour obtenir le décalage de l’élément en octets, et l’utiliser pour obtenir l’adresse de l’élément dont vous avez besoin.