2016-05-17 41 views
0

我是C/C++的新手。經過長時間的研究,我需要你的幫助。我只想在unsigned char*中存儲一個號碼,然後將號碼重新輸入。int爲無符號字符*反之亦然

int nu = 50; 
unsigned char byteArray[sizeof(int)]; 
memcpy(byteArray, &nu, sizeof(int)); 

int newNu = reinterpret_cast<int>(byteArray); 

我期待newNu將是50,而不是。任何人都可以告訴我我錯在哪裏?

對於int - >unsign char*我認爲我是正確的,但如何扭轉進展?這是正確的方式嗎?順便說一句,我編譯這Visual Studio

+1

如果你是新的C++不碰數組,指針,memcpy的,特別是與六隻腳杆的reinterpret_cast。 –

+1

謝謝大家,我剛剛開始自學C/C++幾個月。同意搞亂內存管理是一件很痛苦的事情。我現在會慢一點... –

回答

7

您的演員將數組地址轉換爲數字。

正確的方法來獲取值的是:

int newNu; 
memcpy(&newNu, byteArray, sizeof newNu); 

注:天真的嘗試是:

newNu = *reinterpret_cast<int *>(byteArray); 

然而,這違反了strict aliasing rule,以及可能作爲一個對齊違例。不要這樣做。警告:您可能會在各種(不是很好)的參考文獻中看到這個錯誤。

1

不要這樣做!

,但如果你是剛剛經歷......

這部分是不正確的:

int newNu = reinterpret_cast<int>(byteArray); 

您鑄造char陣列的地址int這絕對不是50 ...

這是代碼,讓你期待什麼:

int newNu = *reinterpret_cast<int*>(byteArray); 

另外要注意參數順序memcpy ... 應該

memcpy(&newNu, byteArray, sizeof newNu); 
相關問題