为什么后缀增量对 void *ptr 不起作用,但 ptr = ptr + 1 有效?

Why does postfix increment not work on a void *ptr, but ptr = ptr + 1 works?

如果我这样做:

int x = 10;
void *ptr = &x;
ptr++;

第"ptr++"行报错

但是,如果我这样做而不是 "ptr++":

ptr = ptr + 1;

它工作得很好。可能是什么原因?

C 标准禁止对 void* 进行指针运算。虽然取决于编译器。 原因很简单,C不是汇编:-)

空指针算法在标准 C 中是非法的,但通常被 gcc 扩展允许。

从概念上讲,这是因为当您对指针执行递增时,它实际上会在后台执行缩放以添加适当数量的字节(由指针的类型给定),从而使您到达下一个数据单元.

由于 void 指针可以指向任何类型,因此可以避免以不同于预期的方式访问部分内存。编译器无法确定如何缩放加法,因为它不知道指向的类型。

在标准 C 中,ptr = ptr + 1 也是非法的,原因相同。您看到一项工作的原因是由于 gcc 扩展存在同样的问题。

当使用 -pedantic-errors 标志时,两者都会在 gcc 中给你错误。