由位元組對齊產生的乙個應用崩潰的問題

2022-09-05 09:18:11 字數 846 閱讀 1959

1.起因:cocos2dx打包到手機後,接收資料訊息進行處理時崩潰(同一套**在windows和centos下都能正常執行)

乙個由char+short+short+short+long long組成的資料通過網路傳給客戶端的時候,進行反向資料型別解析還原的時候在long long的位置崩潰掉了。

如下面的**:

long

long out_val = *((long

long*)(_recv_data_buf + 3*sizeof(short) + sizeof(char)));

2.從上面的**來看是完全沒有問題的,該用#program pack(1)的都用了,同時也通過sizeof乙個資料結構來驗證的確是1位元組對齊的。

後面在查詢相關資料的時候,發現了如下的帖子:《c語言 位元組型指標轉換成整型指標 引發4位元組對齊問題》

關鍵資訊截圖如下:

3.通過上面的資訊,列印一下對應的long long資料對應的記憶體位址位置,發現是乙個單數,肯定是非8位元組的邊界上。(上面提到int在4位元組邊界,猜測long long在8位元組邊界,暫時沒有找到相應資料佐證這個猜測)

4.解決辦法:不使用直接資料轉換,使用memcpy,修改後不再崩潰且資料正確,如下:

long

long

out_val;

memcpy(&out_val, _recv_data_buf + 3*sizeof(short)+sizeof(char), sizeof(long

long));

乙個軟體引發的崩潰

今天筆記本正常重啟後,出現 c000021a unknown hard error 的錯誤。無論是安全模式,命令列模式都無法正常登入系統,重視出現以上錯誤。看到這個錯誤貌似由於硬體錯誤,第乙個反應會不會是磁碟壞道,分析一下似乎又不是,搜尋也有遇到這種情況,但情況各不相同。沒有太多精力去分析原因,還好...

unsafe包的應用與位元組對齊

以乙個例子來說明 package misc type s struct func main fmt.println unsafe.sizeof s 16 因為位元組對齊的緣故不是13 fmt.println unsafe.sizeof s 8 s是指標,在64位系統裡指標佔8個位元組,指標就是記憶體...

乙個應用程式產生乙個訊息佇列嗎

一般來講,乙個應用程式對應唯一的乙個程序號,該程序號對應的資源 建立的時間 記憶體等,都是一一對應的,該程序產生的訊息也是唯一的,不會跟其他應用程式衝突。應用程式需要跟核心 或稱系統 進行互動,那麼就要傳遞訊息,就有訊息管理機制。應用程式產生的訊息,會加入系統的訊息佇列當中,根據優先順序管理 排程等...