2011-04-27 48 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