2015-07-19 64 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不是彙編:-)

相關問題