希望对答案有更好的理解
给出this帖子,有人可以向我解释一下吗
以下循环缓冲区实现是可能的,并且如果
不,为什么不。
#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;
}
我知道 LHS 必须转换为 char 以便我可以
取消引用 void 指针。我也明白这段代码
分段:
buffer->elements[buffer->start]
给出元素的“buffer->start”元素的地址
数组,我还想取消引用它以便到达
该地址的内容。或者至少这就是我从中得到的
K&R。
鉴于这一切,我如何告诉编译器,内容
该地址处的内存是一个字符,并且可以
取消引用它?这里发生了一些事情,我只是不知道
理解。
buffer->elements
也是一个void *
所以你需要先投射它,然后才能用它做任何事情:
*(char*)element = ((char *)buffer->elements)[buffer->start];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)