2013-06-11 33 views
1

我有一個我在無符號字節數組中接收到的值,我想以浮點形式解引用。以ptr作爲uint8_t *指向四個值0,0,0xCD,0x42的字節數組(這是一個小端系統)。在Code Composer Studio中解引用指針

float val = *(float*)ptr; 

是返回-1.34e8

當我鍵入:

*(float*)ptr; 

在表達式窗口擊中的代碼段一個破發點後,它給了我102.5預期。此外,當我輸入:

*(float*)(ptr - 1); 

我得到不正確的-1.34e8,好像編譯器使用ptr-1而不是我輸入的內容。

我很困惑 - 我錯過了什麼嗎?

+0

基本上deref是正確的。如果你printf(「%p」,ptr);你得到的地址可能不是4字節對齊(或至少2字節)? (這在某些平臺上可能是必需的)。順便說一句,(ptr-1)返回一個字節(因爲它是一個uint8_t *),通常不會返回一個浮點大小。 – QSQ

+0

是的,這是奇怪的事情。 ptr - 1返回一個字節,所以就好像我的原始代碼*(float *)ptr;正在返回一個字節並從那裏解釋四個浮點字節,而不是從ptr開始。我的觀點是,當代碼在調試器中停止時,*(float *)ptr給了我期望在運行時得到的結果,*(float *)(ptr-1)給了我在運行時實際得到的結果。 – ace

+1

如果編譯器未正確對齊,則編譯器可能會舍入ptr值。嘗試printf(「%p」,ptr);在源代碼中,然後檢查結果是否與調試器給出的結果相同(只是將指針本身打印在dbg中)。 – QSQ

回答

2

基本上deref是正確的。

如果你printf("%p", ptr);你得到的地址可能不是4字節對齊(或至少2字節對齊)?這在某些平臺上可能是必需的。

爲了測試,只需在uint8_t *中傳遞一個真實浮點值即可。

float f= 102.5; 
yourfunct((uint8_t*)&f); 

看看是否有效。

0
*(float*)(ptr - 1); 

是一樣的,因爲這

ptr--; //move the pointer to point to charackter in front of the previous one 
*(float*)ptr; 

這是你的意圖? 或者你只是想從指向ptr的值中減去1。

+0

我不想從中減去。我在說的是,在運行時解除引用ptr作爲一個浮動,就像我已經將指針取消引用回一個字節一樣。 – ace