#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*,因为:
指针运算是通过将k指针作为指向void(C99§6.5.6/ 7)数组的第一个元素(#0)的指针来完成的,k+1并将返回此"数组"中的元素#1(§6.5.6/ 8) .
为此,我们需要考虑一个数组void.相关信息void是(§6.2.5/ 19)
该
void类型包含一组空值; 它是一种不完整的类型,无法完成.
但是,数组的定义要求元素类型不能不完整(§6.2.5/ 20,脚注36)
由于对象类型不包含不完整类型,因此无法构造不完整类型的数组.
因此k+1不能成为有效的表达.
| 归档时间: |
|
| 查看次数: |
7871 次 |
| 最近记录: |