Desreferenciación de punteros nulos

Con la esperanza de obtener una mejor comprensión de las respuestas dadas enesta publicar, ¿puede alguien explicarme si la siguiente implementación de búfer circular es posible y, de no ser así, por qué no?

#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;
}

Entiendo que el LHS se debe convertir al char para que pueda desreferenciar el puntero del vacío. También entiendo que este fragmento de código:

buffer->elements[buffer->start]

da la dirección del elemento 'buffer-> start' de la matriz de elementos, que también quiero eliminar para acceder al contenido de esa dirección. O al menos eso es lo que tomo de K&R.

Dado todo esto, ¿cómo le digo al compilador que el contenido de la memoria en esa dirección es un char y que está bien desreferenciarlo? Hay algo que está pasando aquí que simplemente no entiendo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta