幾年前,調試過一個加密解密算法程序,原來這個程序是在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: for (int i =0; i < Len; i ++)
6: {
7: pS[i] ...
8: }
每次都是在line 4處Crash,最開始的時候不知道爲什麼,後來查閱資料發現,ArcLinux上對不同的數據類型,採用的內存地址是有不同對齊方式的,譬如: uint8 *這種是採用4字節對齊的地址,而unsigned int*這種類型則是8字節對齊的地址。如果強制把一個非8字節對齊的uint8*的地址轉換爲unsigned int*,這將導致系統內存檢測失敗,直接crash。
因此,在嵌入式系統千萬注意指針轉換,尤其是不同類型的指針轉換,通常,不同的數據類型有各自的內存對齊規則!