以下代码使用 gcc 进行编译void ptr
尽管算术不是标准的:
int main(){
int a = 5;
void* b = (void*) &a;
b++;
}
这是 GCC 支持的扩展。 它像对待char *
一样对待void *
。
来自 gcc 文档:
6.24
void
指针和函数指针的算术在 GNU C 中,加法和减法运算在 指向
void
的指针和指向函数的指针。这是由 将void
或函数的大小视为 1。这样做的结果是,
sizeof
也允许在void
和 函数类型,并返回 1。
这是因为最初 C 中没有类型void
。取而代之的是char
型发挥了作用。sizeof( char )
等于 1。
例如,我看到一个非常旧的遗留代码,其中写着
memset( ( char * )p, 0, n );
其中参数 p 的类型为int *
。
因此,这样做似乎是为了向后兼容。