警告:减法中使用的类型为'void *'的指针

时间:2010-04-26 03:06:56

标签: c

虽然它运行正常,但以下结果导致上述编译器警告:

return ((item - (my->items))/(my->itemSize));

'item'是'void *'; 'my-> items'是'void *'; 'my-> itemSize'是'int'

将'item'和'my-> items'转换为'int *'会导致程序运行不正常。删除警告的最佳方法是什么?

4 个答案:

答案 0 :(得分:16)

带指针的加法和减法与指向类型的大小一起使用:

int* foo = 0x1000;
foo++;
// foo is now 0x1004 because sizeof(int) is 4

从语义上讲,void的大小应该为零,因为它不代表任何东西。因此,void指针上的指针算法应该是非法的。

但是,由于多种原因,sizeof(void)返回1,并且算术运算就好像它是char指针一样。因为它在语义上是不正确的,所以你会收到警告。

要取消警告,请使用char指针。

答案 1 :(得分:3)

转换为char *

return ((char *)item - (char *)my->items)/my->itemSize);

由于char的大小为1个字节,因此您将获得与int *指针示例相关的值,该示例计算两个地址之间有多少int个。这就是指针算法的工作原理。

答案 2 :(得分:0)

问题是你在指针中进行aritmethical操作,我想知道它是如何正常运行的。

答案 3 :(得分:0)

如果您尝试进行常规算术,则必须取消引用指针(例如*item)。如果您正在尝试执行指针运算,则指针必须是类型,如char*int*(否则编译器将不知道要递增多少)。