如果我這樣做:爲什麼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