1.起因:cocos2dx打包到手機後,接收資料訊息進行處理時崩潰(同一套**在windows和centos下都能正常執行)
乙個由char+short+short+short+long long組成的資料通過網路傳給客戶端的時候,進行反向資料型別解析還原的時候在long long的位置崩潰掉了。
如下面的**:
long2.從上面的**來看是完全沒有問題的,該用#program pack(1)的都用了,同時也通過sizeof乙個資料結構來驗證的確是1位元組對齊的。long out_val = *((long
long*)(_recv_data_buf + 3*sizeof(short) + sizeof(char)));
後面在查詢相關資料的時候,發現了如下的帖子:《c語言 位元組型指標轉換成整型指標 引發4位元組對齊問題》
關鍵資訊截圖如下:
3.通過上面的資訊,列印一下對應的long long資料對應的記憶體位址位置,發現是乙個單數,肯定是非8位元組的邊界上。(上面提到int在4位元組邊界,猜測long long在8位元組邊界,暫時沒有找到相應資料佐證這個猜測)
4.解決辦法:不使用直接資料轉換,使用memcpy,修改後不再崩潰且資料正確,如下:
longlong
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個位元組,指標就是記憶體...
乙個應用程式產生乙個訊息佇列嗎
一般來講,乙個應用程式對應唯一的乙個程序號,該程序號對應的資源 建立的時間 記憶體等,都是一一對應的,該程序產生的訊息也是唯一的,不會跟其他應用程式衝突。應用程式需要跟核心 或稱系統 進行互動,那麼就要傳遞訊息,就有訊息管理機制。應用程式產生的訊息,會加入系統的訊息佇列當中,根據優先順序管理 排程等...