0

假設我有一個有效的指針p0將指針轉換爲整數,遞增該整數並投回是否安全?

T a[10]; 
T* p0 = &a[0]; 

我知道,我可以放心地往返投這樣的:

reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0)) == p0; 

但是,它的安全做到以下幾點?

T* p1 = reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0) + sizeof(T)); 

即,我可以確定沒有UB,並且p1 == &a[1]

+0

你是什麼意思「我可以確定沒有無符號字節」? *哪裏*? – theV0ID

+4

@ theV0ID UB是C++世界中未定義行爲的流行縮寫。 – bashrc

+0

我敢肯定,在字地址系統上會失敗,通過'n'遞增地址使得地址進一步指向'n * wordsize'字節。 – user2357112

回答

1

這是實現定義的行爲。您的編譯器應記錄指針算術是否等價於指針的轉換數值上的整數算術。在具有「扁平」字節地址內存空間的現代計算機上應該是這種情況;但並不保證在所有平臺上都可以輕鬆地工作。

使用char*而不是uintptr_t可以輕鬆地工作,只要您保持在陣列中並確保指針在轉換回前爲T正確對齊。