在更好地瞭解答案的希望 在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讓我能 取消引用空指針。我也明白,這個代碼 片段:
buffer->elements[buffer->start]
給人的元素 陣列,這也是我想非關聯化「buffer->開始」元素的地址,以獲得對 內容是地址。或者說,至少這是我從 ķ&採取R.
鑑於這一切,我怎麼告訴編譯器的 內存在該地址的內容是char,而且它是好的 取消對它的引用?有一些事情在這裏,我只是不明白 。
此代碼不能編譯,不是嗎? '*(buffer-> elements [buffer-> start])'是一個'void *'的引用。 – dasblinkenlight
@dasblinkenlight:這就是他的問題所在。我認爲他沒有充分理解它的作用,而是從K&R拉開了左手邊。 –
Zack,是你的通用緩衝區的'類型',一旦它被初始化和分配,就被修復了嗎?如果是這樣,你可以很好地使用不同指針類型的「union」來放棄所有的指針投射。 – WhozCraig