我可以对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)
。