虽然它运行正常,但以下结果导致上述编译器警告:
return ((item - (my->items))/(my->itemSize));
'item'是'void *'; 'my-> items'是'void *'; 'my-> itemSize'是'int'
将'item'和'my-> items'转换为'int *'会导致程序运行不正常。删除警告的最佳方法是什么?
答案 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*
(否则编译器将不知道要递增多少)。