“指針轉換”惹得禍

幾年前,調試過一個加密解密算法程序,原來這個程序是在Windows和Linux平臺可以順利編譯並運行;我把程序移植到了嵌入式的ArcLinux上,程序可以順利編譯,唯獨運行的時候,每次都在地址轉換的時候程序崩潰。程序大概如下:

   1: void func_special(uint8 * pData, const int DataLen)
   2: {
   3:     int Len = DataLen / 4;
   4:     unsigned int * pS = (unsigned int *)pData;//ERROR.Lead to crash
   5:     forint i =0; i < Len; i ++)
   6:     {
   7:         pS[i] ...
   8:     }

每次都是在line 4處Crash,最開始的時候不知道爲什麼,後來查閱資料發現,ArcLinux上對不同的數據類型,採用的內存地址是有不同對齊方式的,譬如: uint8 *這種是採用4字節對齊的地址,而unsigned int*這種類型則是8字節對齊的地址。如果強制把一個非8字節對齊的uint8*的地址轉換爲unsigned int*,這將導致系統內存檢測失敗,直接crash。

因此,在嵌入式系統千萬注意指針轉換,尤其是不同類型的指針轉換,通常,不同的數據類型有各自的內存對齊規則!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章