2014-12-22 60 views
2

我在解除引用分配給指針的值時遇到問題。C/C++雙指針取消引用問題

考慮以下功能的正常工作:

void encode(int32_t *pInput, unsigned char **ppOutput) 
{ 
    **(int32_t **)ppOutput = *(int32_t*)pInput; 
    *ppOutput += sizeof(int32_t); 
} 

現在,當我嘗試去參考值,使用反向邏輯如下:

void decode(unsigned char **ppInput, int32_t *pOutput) 
{ 
    *(int32_t *)pOutput = **(int32_t**)ppInput; 

    *ppInput += sizeof(int32_t); 
} 



*(int32_t *)pOutput = **(int32_t**)ppInput; 

然後

*(int32_t *)pOutput 

包含垃圾,但如果更改邏輯,

*(int32_t *)pOutput = **ppInput; 

然後

*(int32_t *)pOutput 

包含正確的值。

請引導我在哪裏我錯過了線索。

+2

我看到比天文館裏面的更多的恆星。不要在你的文章中使用星號來強調它,因爲它會讓代碼看起來更加困惑。 – PaulMcKenzie

+1

在解除引用方面,我有點自信:**(int32_t **)ppInput'實際上應該是這樣的:'*(int32_t *)(* ppInput)'。在* real * [MCVE](https://stackoverflow.com/help/mcve)中查看* real *代碼將會清除這個問題。 – WhozCraig

+0

你爲什麼要這樣做?別。 –

回答

1
*(int32_t *)pOutput = **(int32_t**)ppInput; 

您鑄造指針unsigned char*爲指針int32_t*。那是你要說的從unsigned char字節的內存位置讀取int32_t字節的大小。所以,這肯定會給你垃圾值sizeof(int32_t) > sizeof(unsigned char)

對象指針可以顯式轉換爲不同類型的對象指針。當「T1指針」類型的prvalue v被轉換爲類型「指向cv T2的指針」時,如果T1和T2都是標準佈局類型,並且T2的對齊要求爲,則結果爲static_cast(static_cast(v))不比T1的更嚴格,或者任何一種類型都是無效的。將「指向T1的指針」類型的prvalue轉換爲類型「指向T2的指針」(其中T1和T2是對象類型,並且T2的對齊要求不比T1的對齊要求更嚴格)並返回到其原始類型,指針值。任何其他這種指針轉換的結果都是未知的。

+0

我一直在看它一會兒。我的直覺是它的未定義的行爲。我不知道編譯器的警告有什麼要說的...他應該使用'memmove'來避免它...... – jww

+0

是的,我認爲這個手頭的編譯器會發出一些東西... – ravi

+0

好的,但我當ppOutput(來自編碼函數)在解碼函數中作爲ppInput傳遞時,不要認爲上述原因應該成爲問題。假設ppOutput指向一個指向char數組的指針,比如4000字節的大小。 例如, unsigned char test [4000]; unsigned char * pEnc = test; unsigned char ** ppOutput = &pEnc; –