C语言 为什么 gcc 中允许空指针算法?



以下代码使用 gcc 进行编译void ptr尽管算术不是标准的:

int main(){
int a = 5;
void* b = (void*) &a;
b++;
}

这是 GCC 支持的扩展。 它像对待char *一样对待void *

来自 gcc 文档:

6.24void指针和函数指针的算术

在 GNU C 中,加法和减法运算在 指向void的指针和指向函数的指针。这是由 将void或函数的大小视为 1。

这样做的结果是,sizeof也允许在void和 函数类型,并返回 1。

这是因为最初 C 中没有类型void。取而代之的是char型发挥了作用。sizeof( char )等于 1。

例如,我看到一个非常旧的遗留代码,其中写着

memset( ( char * )p, 0, n );

其中参数 p 的类型为int *

因此,这样做似乎是为了向后兼容。

最新更新