void*算术

Onk*_*jan 23 c auto-increment

#include<stdio.h>
int main(int argc,char *argv[])
{
   int i=10;
   void *k;
   k=&i;

   k++;
   printf("%p\n%p\n",&i,k);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

++是对void*的合法操作吗?有些书说它不是,但K&R没有说任何关于void*算术的内容(K&R 2/e的第93,103,120,199页)

请澄清.

PS:GCC至少在k ++中没有抱怨.

ken*_*ytm 35

这是GCC的延伸.

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

如果添加-pedantic标志,它将产生警告:

warning: wrong type argument to increment

如果您想遵守标准,请将指针强制转换为char*:

k = 1 + (char*)k;
Run Code Online (Sandbox Code Playgroud)

该标准指定一个不能执行addition(k+1)void*,因为:

  1. 指针运算是通过将k指针作为指向void(C99§6.5.6/ 7)数组的第一个元素(#0)的指针来完成的,k+1并将返回此"数组"中的元素#1(§6.5.6/ 8) .

  2. 为此,我们需要考虑一个数组void.相关信息void是(§6.2.5/ 19)

    该void类型包含一组空值; 它是一种不完整的类型,无法完成.

  3. 但是,数组的定义要求元素类型不能不完整(§6.2.5/ 20,脚注36)

    由于对象类型不包含不完整类型,因此无法构造不完整类型的数组.

因此k+1不能成为有效的表达.


Jen*_*edt 5

不,算术void*不在标准范围内.使用char*此.