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)
鉴于这一切,我如何告诉编译器该地址的内存内容是一个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
.