Re: [問題] struct的field位址出錯

看板C_and_CPP作者 (df)時間14年前 (2011/10/01 09:05), 編輯推噓4(404)
留言8則, 6人參與, 最新討論串2/2 (看更多)
自問自答一下... 最近在查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
不要把struct指標直接向raw data
10/01 09:19, 1F

10/01 09:19, , 2F
^指向
10/01 09:19, 2F

10/01 12:25, , 3F
直接用U8 pointer拆到struct裡面
10/01 12:25, 3F

10/01 13:05, , 4F
小弟我在您的原文就推過方法了呀....Orz
10/01 13:05, 4F

10/01 16:01, , 5F
你對該struct下__packed__屬性,會hint arm gcc 用兩個ldrb
10/01 16:01, 5F

10/01 16:02, , 6F
而不是一個ldrh去讀..
10/01 16:02, 6F

10/01 17:48, , 7F
推Victor,我的確是照你的方法才找出答案的...謝謝^^
10/01 17:48, 7F

10/02 18:00, , 8F
short a; memcpy(&a,xx->shorted,sizeof(short)); 再用a即可
10/02 18:00, 8F
文章代碼(AID): #1EXcS-9R (C_and_CPP)
文章代碼(AID): #1EXcS-9R (C_and_CPP)