Déréférencement des pointeurs vides

Dans l’espoir de mieux comprendre les réponses données dans ce message, quelqu’un peut-il m’expliquer s’il est possible de mettre en œuvre la mémoire tampon circulaire suivante, et si non, pourquoi pas.

#define CB_TYPE_CHAR 0 #define CB_TYPE_FLOAT 1 ... typedef struct CBUFF { uint16 total; /* Total number of array elements */ uint16 size; /* Size of each array element */ uint16 type; /* Array element type */ uint16 used; /* Number of array elements in use */ uint16 start; /* Array index of first unread element */ void *elements; /* Pointer to array of elements */ } CBUFF; ... void cbRead(CBUFF *buffer, void *element) { if (buffer->type == CB_TYPE_CHAR) { /* The RHS of this statement is the problem */ *(char*)element = *(buffer->elements[buffer->start]); } /* Other cases will go here */ buffer->start = (buffer->start + 1) % buffer->total; --buffer->used; } 

Je comprends que le LHS doit être converti en caractères afin que je puisse déréférencer le pointeur vide. Je comprends aussi que ce fragment de code:

 buffer->elements[buffer->start] 

donne l’adresse de l’élément ‘buffer-> start’ du tableau elements, que je souhaite également déréférencer pour obtenir le contenu de cette adresse. Ou du moins c’est ce que je tire de K & R.

Compte tenu de tout cela, comment puis-je dire au compilateur que le contenu de la mémoire à cette adresse est un caractère et qu’il est acceptable de le déréférencer? Il y a quelque chose qui se passe ici que je ne comprends tout simplement pas.

buffer->elements est aussi un void * , vous devez donc le lancer avant de pouvoir faire quoi que ce soit avec:

 *(char*)element = ((char *)buffer->elements)[buffer->start]; 

Compte tenu de tout cela, comment puis-je dire au compilateur que le contenu de la mémoire à cette adresse est un caractère et qu’il est acceptable de le déréférencer?

Eh bien, vous l’avez déjà fait sur le LHS de cette ligne:

 *(char*)element = *(buffer->elements[buffer->start]); 

Pour déréférencer buffer->elements[n] vous devrez également le buffer->elements[n] .

 *(char*)element = *((char*)buffer->elements)[buffer->start]; 

Maintenant, la question est de savoir si ce casting est correct. Je ne peux pas vous dire cela car vous n’avez pas buffer->elements l’initialisation de buffer->elements .