我有一個動態定義的無符號的8位整數的數組:GCC浮子指針鑄造在C++中引起錯誤SIGBUS
const uint8_t *data;
這包含一個字節流,並且被重新解釋爲各種數據類型。我可以在這個數據流重新詮釋的位置ň作爲基本型類型:
type value = *((type*) &data[n]);
此使用gcc Linux下編譯時使用Visual Studio編譯器的Windows下的所有數據類型工作正常,但是,當類型是一個浮點數(解引用的位置在數據數組範圍內)時,會產生一個SIGBUS錯誤。進一步的調查顯示,它是導致此錯誤的指針解除引用。我已經通過使用memcpy解決了這個問題,但想知道爲什麼這會導致問題,首先看到引用的地址是有效的。 reinterpret_cast會更合適嗎?如果是這樣,爲什麼?
編輯:
我沒有提到,Linux系統有ARM架構。 @MSalters指出,差異配置可能會有更嚴格的指針對齊要求。一個簡短的研究表明,雖然上述內容在x86體系結構上有效(儘管C/C++標準不允許),但ARM上未對齊的指針解引用將導致總線錯誤。
如果你這樣做是在暗中搗鬼,我會考慮再來看看設計 – 2014-10-02 10:05:19
它只能和花車發生的呢?或者其他類型與float相同? – James 2014-10-02 10:08:19
該設計適用於允許通過rs232接口進行通信的網絡協議,以及位於tcp/ip之上的網絡協議。數據類型是在幀頭中定義的,所以需要這種解釋。 – Hampycalc 2014-10-02 10:09:12