编译器是否应该使用void指针警告指针算术?

时间:2014-01-07 09:21:19

标签: c pointers

我正在使用gcc 4.7.2编译C程序。我总结了一个带有一些偏移的void *类型的地址。 (void * + size)应该发出警告。如果不是那么如果大小是1&则将添加多少字节。如果大小是50。 我唯一关心的是应该警告我们正在添加一些无效指针?

 12         int size = 50;
 /*Allocate a block of memory*/
 14         void *BlockAddress   = malloc(200);
 15         if(!BlockAddress)
 16                  return -1;
 17         address1             = (int *)BlockAddress;
 18         address2             = BlockAddress + 1*size;
 19         address3             = BlockAddress + 2*size;

谢谢

3 个答案:

答案 0 :(得分:10)

你不应该对void指针进行指针运算。

来自C标准

  

6.5.6-2:另外,两个操作数都应具有算术类型,或者一个操作数应是指向对象类型的指针,另一个操作数应具有整数类型。

     

6.2.5-19:void类型包含一组空值;这是一个不完整的类型,无法完成。

GNU C通过考虑void的大小为1来实现上述目标。

来自 6.23 Arithmetic on void- and Function-Pointers

  

在GNU C中,指向void的指针和指向函数的指针都支持加法和减法操作。这是通过将空白或函数的大小视为1来完成的。

所以我们得到以上几行:

 address2             = BlockAddress + 1*size; //increase by 50 Bytes
 address3             = BlockAddress + 2*size; //increase by 100 Bytes

答案 1 :(得分:9)

使用void *的指针算法是GCC extension而不是标准C.

最好不要做这些事情。使用char * BlockAddress = malloc(200);或将其投放到address2address3

答案 2 :(得分:0)

这完全有效。 void *包含一个地址,添加一个只是指向内存中的下一个字节。这里没什么可担心的......