2016-05-17 22 views
0

C/C++を初めて使用しています。長い研究の末、私はあなたの助けが必要です。私はちょうどunsigned char*に番号を格納して、その番号を戻したいと思っています。int to unsigned char *およびその逆

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

int newNu = reinterpret_cast<int>(byteArray); 

私はnewNuが50になると予想していますが、代わりにそうではありません。誰かが私にどこを間違っているかを教えてもらえますか?

int - >unsign char*私は正しいと思いますが、進歩を逆転させる方法はありますか?それは正しい方法ですか? btw、私はこれを編集しましたVisual Studio

+1

でなければなりません... memcpyのパラメータの順序に注意を払う、そして特に6足の極にreinterpret_castは。 –

+1

ありがとう、私はちょうど数ヶ月間C/C++を自己学習するようになった。メモリ管理を混乱させることはそんなに苦痛だと同意する。私は今、ゆっくり歩くだろう... –

答えて

7

キャストは配列のアドレスを数値に変換します。

値を取得するための正しい方法である:

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

注:ナイーブ試みは次のようになります

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

しかし、これはstrict aliasing ruleに違反、ならびに潜在的にアライメント違反であります。こんなことしないで。警告:このミスはさまざまな(あまり良くない)参照で繰り返されることがあります。

1

Do not do !!!

しかし、場合にあなただけのこの部分は間違っている...

を経験している:

...

int newNu = reinterpret_cast<int>(byteArray); 

あなたは間違いなく50ではありませんintchar配列のアドレスをキャストしています

これは、あなたが期待するものを取得するためのコードです:

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

はまた、あなたは、配列、ポインタ、memcpyのには触れていないC++を初めて使用する場合それは

memcpy(&newNu, byteArray, sizeof newNu); 
関連する問題