2015-07-19 58 views
-2

如果我这样做:为什么postfix增量不能在void * ptr上工作,但是ptr = ptr + 1的工作原理是什么?

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

线 “PTR ++” 给出了一个错误。

然而,如果不是 “PTR ++” 我这样做:

ptr = ptr + 1; 

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

+2

[Can not reproduce。](http://ideone.com/oY6sNh) –

+0

哪个编译器? – dlask

+2

C没有在void指针上定义指针运算。所以你可能会看到一个编译器扩展或bug。那么你在用什么编译器? – nos

回答

4

无效指针算术在标准C中是非法的,但通常由gcc扩展允许。

从概念上讲,这是因为当你在一个指针上执行一个增量时,它实际上会在后台执行缩放以添加适当数量的字节(由指针的类型给出)以使你获得下一个数据单元。由于void指针可能指向任何类型,因此它可以使您不再以不同的方式访问内存部分。编译器无法确定如何扩展该添加,因为它不知道指向的类型。

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

使用-pedantic-errors标志时,两者都会在gcc中出错。

+0

所以你的意思是说,两者都应该根据C标准给出错误?第二个是因为编译器不同而工作的? – mb1994

+0

是的,很多机器都有很多不同的gcc扩展,可能允许一些事情,但不允许其他扩展。但是,您可以使用'-pedantic-errors'标志根据C标准报告错误。 – Purag

+0

在一个理想的世界里,无论是两者都行,或者都不行,因为无论如何它们在本地代码中都是一样的。但唉... – Purag

1

C标准禁止void *上的指针算术。取决于编译器。 原因很简单,C不是汇编:-)

相关问题