2011-06-15 43 views
0

我有一個函數,我試圖從大塊數據中取16位。我在Solaris機器上運行此代碼,並且可以在沒有警告或錯誤的情況下進行編譯。然而,當我運行這段代碼時,無論何時它到達了我的指針去掉的地方,我都會立即發生總線錯誤。代碼看起來是這樣的:Solaris去引用總線錯誤

void find_info(unsigned char* packet) { 

int offset = 9; 
uint16_t short_value = *(uint16_t*)(packet+offset); 

} 

當我試圖去參考,爲了得到一個簡短的「包+偏移」指針發生的總線錯誤。我知道在數據包[offset]和數據包[offset + 1]上有數據。在Linux和Cygwin上,這段代碼工作正常。據我所知,我沒有做任何革命性的事情。這裏發生了什麼?

回答

3

聽起來像對齊問題。在Sun SPARC處理器上,只能通過可被2的某個冪(通常爲8)整除的指針訪問類似short的內容。因此offset = 9的值顯然會導致問題。

請參閱http://blogs.oracle.com/d/entry/on_misaligned_memory_accesses瞭解更多詳情。

我不能推薦任何方式來解決這個問題,而沒有看到更多的上下文;但是如果你從一些輸入源讀取數據,你可以只讀字節並使用ntohs轉換爲一個簡短的內容(詳情請參見ntohs手冊頁)。

+0

非常有趣。我將不得不進行更多的實驗,但是感謝給我帶來了正確的方向。 – Poff 2011-06-15 17:30:30