Re: [問題] struct的field位址出錯
自問自答一下...
最近在查ARM的exception, 意外發現這問題的答案(應該是吧...)
這的確是跟alignment有關
感謝板友提供的方法, 發現出錯的位址剛好都在unaligned的位址上
也就是short形態的位址指向 末數bit為1的位址(eg. 0xXXXXXXX1, 0xXXXXXXX3,...)
這時候就會發生取值錯誤的現象
這個現象應該是因為ARM的特性(請參考arm arm的document:http://ppt.cc/Wcl- )
遇到這種狀況的behavior是UNPREDICTABLE(page A2-40)
我想這應該就能解釋為什麼ARM平台上會出錯,而用vc++不會了
不過我對ARM很不熟
請問板上的高手們, 如果真原因是這個
那有辦法避免嗎?
謝謝
※ 引述《porger (df)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: ARM GCC
: 我有一筆raw data要parse
: 假設raw data如下:
: C0 03 6F 44 01
: 我定義一個struct為
: typedef struct
: {
: unsign char Tag;
: unsign char Len;
: unsign short Add;
: unsign char ID;
: }Tlv_s;
: 並宣告變數 Tlv_s * tlvPtr;
: 並指向raw data第一個byte的位址
: 接著
: printf("Tag = %x, Len = %x, Add = %x\n",tlvPtr->Tag,tlvPtr->Len,tlvPtr->Add);
: 得到的結果是
: Tag = C0, Len = 3, Add = 6F03
: 請問為什麼不是
: Tag = C0, Len = 3, Add = 446F
: 我想問的是觀念的問題, 程式就不詳細描述了
: 另外補充幾點:
: 1. 同樣一份code我用vc++跑就會出現 Add = 446F
: 2. 在我的工作平台上重複parse幾筆raw data
: 則有的出現第一種情形,有的出現第二種情形
: 每次跑每次結果都一樣,也就是出現第一種情形的data永遠出現第一種,第二種也是
: 這個問題困擾我很久, 甚至不知道該怎麼找答案...
: 感覺就是遇到鬼了......
: 期望有高手能相救
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.136.74.253
推
10/01 09:19, , 1F
10/01 09:19, 1F
→
10/01 09:19, , 2F
10/01 09:19, 2F
→
10/01 12:25, , 3F
10/01 12:25, 3F
推
10/01 13:05, , 4F
10/01 13:05, 4F
推
10/01 16:01, , 5F
10/01 16:01, 5F
→
10/01 16:02, , 6F
10/01 16:02, 6F
→
10/01 17:48, , 7F
10/01 17:48, 7F
推
10/02 18:00, , 8F
10/02 18:00, 8F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):