我可以对C中的void *指针进行算术运算吗?

这是有效的

void *p = &X; /* some thing */ p += 12; 

如果是的话,p现在指向什么? 我有(第三方)代码执行此操作(并编译干净),我的猜测是void *被视为char *。 我信赖的K&R对此话题保持沉默(ish)

编辑:我的小测试应用程序在gcc 4.1.1上正常运行并将void *视为char *。 但是g ++ barfs

我知道如何正确地做到这一点。 我需要知道是否必须清理此代码库以找到它完成的所有位置。

BTW gcc -pedantic发出警告

摘要:

C规范含糊不清。 它表示在表示和用作函数参数方面void * = char *。 但它对指针算法没有提及。

  • gcc(4)允许它并将其视为char *
  • g ++拒绝它
  • gcc -pedantic警告它
  • vs2010 c和c ++都拒绝它

这取决于编译器。 那些允许它将sizeof(*(void *))视为1。

编辑:它只适用于无效指针算术。 在这种情况下使用sizeof(int)或0的步骤是没有意义的。使用它的人的共同期望是可能的最小步骤。

不,这不合法。 void*不能任意增加。 首先需要将其强制转换为特定类型。

如果你想按特定的字节数递增它,那么这就是我使用的解决方案。

 p = ((char*)p) + 12; 

char类型很方便,因为它的定义大小为1个字节。

编辑

有趣的是它在gcc上运行并发出警告。 我在Visual Studio 2010上测试并validation它不能编译。 我对该标准的有限理解会说明gcc中的错误。 你可以添加以下编译标志

 -Wall -ansi -pedantic 

引用规范:

§6.5.6/ 2 :对于加法,两个操作数都应具有算术类型,或者一个操作数应是指向对象类型的指针,另一个操作数应具有整数类型。 (递增相当于添加1.)

指向void的指针不是指向对象类型的指针,根据以下摘录:

§6.2.5/ 1 :[…]类型被划分为对象类型(完全描述对象的类型),函数类型(描述函数的类型)和不完整类型(描述对象但缺少确定其所需信息的类型)大小)。

§6.2.5/ 19 :void类型包含一组空值; 它是一种不完整的类型,无法完成。

因此, 没有为指向void类型的指针定义指针算术。

你的猜测是正确的。

在标准ISO C99第6.2.5节第26段中,它声明void指针和字符指针将具有相同的表示和对齐要求(释义)。

您可能想要查看此问题的最高投票答案

C中空指针的指针算法

我不认为你可以,因为它不知道它的类型,因此无法寻找正确的字节数。

首先将它转换为类型,即(int)