如果我这样做:为什么postfix增量不能在void * ptr上工作,但是ptr = ptr + 1的工作原理是什么?
int x = 10;
void *ptr = &x;
ptr++;
线 “PTR ++” 给出了一个错误。
然而,如果不是 “PTR ++” 我这样做:
ptr = ptr + 1;
它工作得很好。可能是什么原因?
如果我这样做:为什么postfix增量不能在void * ptr上工作,但是ptr = ptr + 1的工作原理是什么?
int x = 10;
void *ptr = &x;
ptr++;
线 “PTR ++” 给出了一个错误。
然而,如果不是 “PTR ++” 我这样做:
ptr = ptr + 1;
它工作得很好。可能是什么原因?
无效指针算术在标准C中是非法的,但通常由gcc扩展允许。
从概念上讲,这是因为当你在一个指针上执行一个增量时,它实际上会在后台执行缩放以添加适当数量的字节(由指针的类型给出)以使你获得下一个数据单元。由于void指针可能指向任何类型,因此它可以使您不再以不同的方式访问内存部分。编译器无法确定如何扩展该添加,因为它不知道指向的类型。
在标准C中,由于相同的原因,ptr = ptr + 1
也是非法的。你看到一个工作的原因是由于与gcc扩展相同的问题。
使用-pedantic-errors
标志时,两者都会在gcc
中出错。
C标准禁止void *上的指针算术。取决于编译器。 原因很简单,C不是汇编:-)
[Can not reproduce。](http://ideone.com/oY6sNh) –
哪个编译器? – dlask
C没有在void指针上定义指针运算。所以你可能会看到一个编译器扩展或bug。那么你在用什么编译器? – nos