取消引用void指针

Zac*_*ack 10 c arrays void-pointers dereference

在更好地了解所给出的答案,希望这个帖子,可以有人请向我解释,如果下面的循环缓冲区的实现是可能的,如果没有,为什么没有.

#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;
}
Run Code Online (Sandbox Code Playgroud)

我知道LHS必须转换为char,以便我可以取消引用void指针.我也明白这个代码片段:

buffer->elements[buffer->start]
Run Code Online (Sandbox Code Playgroud)

给出了elements数组的'buffer-> start'元素的地址,我也想取消引用它以获取该地址的内容.或者至少这是我从K&R那里得到的.

鉴于这一切,我如何告诉编译器该地址的内存内容是一个char,并且可以取消引用它?这里有一些事情,我只是不明白.

Chr*_*odd 13

buffer->elements也是一个void *你需要在你可以做任何事情之前施放它:

*(char*)element = ((char *)buffer->elements)[buffer->start];
Run Code Online (Sandbox Code Playgroud)


Ed *_* S. 5

鉴于这一切,我如何告诉编译器该地址的内存内容是一个char,并且可以取消引用它?

好吧,你已经在该系列的LHS上完成了它:

*(char*)element = *(buffer->elements[buffer->start]);
Run Code Online (Sandbox Code Playgroud)

为了减少buffer->elements[n]你需要投射它.

*(char*)element = *((char*)buffer->elements)[buffer->start];
Run Code Online (Sandbox Code Playgroud)

现在的问题是该演员表是否正确.我不能告诉你,因为你没有发布初始化buffer->elements.