2011-04-27 84 views
3

我有一個緩衝區,本質上是一個char數組,填充了多個不同的結構。結構需要像這樣在緩衝區中傳遞,因爲它是我讀/寫套接字的東西。結構是一個頭結構和可能的「多重有效載荷」結構。無效指針訪問字符數組中的結構

只是爲了說明這一點,它看起來像這樣:

unsigned char buffer[buflen]; 
struct header *head; 
struct payload1 *p1; 
struct payload2 *p2; 

etc... 

現在,當我試圖填補這一緩衝,或從該緩衝區中檢索,我已經使用了void *ptr它首先在位置初始化然後,緩衝器後來在頭後的位置,像這樣的:

void *ptr; 

ptr = &buffer; 
ptr += sizeof(header); 

這實際工作正常 - 即指針指向正確的內存位置,我可以檢索(或插入)一個新的有效載荷結構就好了,但它確實會在中產生警告GCC。 warning: pointer of type ‘void *’ used in arithmetic

在這種情況下,我能做些什麼來避免此警告?

回答

4

使用char *而不是void *。問題是增加一個void *應該做什麼並不明顯。我希望這是一個錯誤,而不是一個警告。

+0

我知道字符通常是1個字節長,因此這將適用於大多數系統,但我認爲它沒有正確定義? – efr4k 2011-04-27 21:11:36

+3

@espengra sizeof(char)由C標準定義爲1.沒有定義的是在void *上執行指針運算。 – 2011-04-27 21:16:15

+0

char被定義爲C99標準中最小的可尋址類型。如果一些不明確的操作系統將char定義爲8位以外的字符,它仍然會被視爲「字節」大小的變量類型。儘管這很少見,並且通常可以忽略。 – 2011-04-27 21:19:36