unsigned char型への構造体に変換*
-
11-09-2019 - |
質問
どのように私はstruct
するには、次のunsigned char*
を変換することができますか?
typedef struct {
unsigned char uc1;
unsigned char uc2;
unsigned char uc3;
unsigned char uc5;
unsigned char uc6;
} uchar_t;
uchar_t *uc_ptr = new uchar;
unsigned char * uc_ptr2 = static_cast<unsigned char*>(*uc_ptr);
// invalid static cast at the previous line
解決
あなたはここにstatic_cast
を使用することはできません。あなたはreinterpret_cast
を使用する必要があります。
基本的には、static_cast
はreinterpret_cast
は、おそらくあなたはそれをこのようにやっている理由を質問するべきであるのに対し、ほとんどのケースで使用されるべきである。
ここでは、static_cast
を使用する時間があります:
class Base {
};
class Derived : Base {
};
Base* foo = new Derived;
Derived* dfoo = static_cast<Derived*>( foo );
は、ここのに対し、あなたはおそらくreinterpret_cast
を必要とする場所です。
void SetWindowText( WPARAM wParam, LPARAM lParam )
{
LPCTSTR strText = reinterpret_cast<LPCTSTR>( lParam );
}
他のヒント
は、構造体のパッキングの違いにより、あなたが開始するために、配列を使用して、または名前で構造体のメンバから一度に新しい配列1を満たされたいくつかのコードを書くのいずれかなしに確実かつポータブルにこれを行うことはできません。 reinterpret_castは一つのコンパイラ/プラットフォーム/バージョンで動作し、他に壊れるかもしれません。
あなたは、ヒープやスタック上の配列を割り当てる方がいいでしょうし、それを一つずつ埋めます。
reinterpret_cast<unsigned char*>
を試してみてください。 static_cast
派生クラスに基本クラスと同じように、互換性のあるタイプの間の変換のためのものです。 reinterpret_cast
は無関係なタイプ間のキャストのためである。
なぜあなたの代わりに、このような奇妙な構造体を使用することになります:
unsigned char型のUC [5]。
は、次に個別UCのように対処することができる[0]、UC [1]、UC [2]、UC [3]、UC [4]および凝集(あなたがunsigned char型としたいおそらく何*)へのポインタただ、 "UC" によるます。
メンバー名に番号が付けられている複数のunsigned char型のメンバを持つ構造体よりもずっと簡単に思える(?UC4に何が起こったのかところでそして、 - 。配列ソリューションは避けるだろう別のエラーを)
どの程度単純ます:
unsigned char * uc_ptr2 = &uc_ptr->uc1;
POD(すなわちC互換性のある構造体)に変換するための最も安全な、最もポータブルな方法をタイプunsigned char型のポインタへのreinterpret_cast
を使用してますがstatic_cast
を使用していない(C ++ 0xのが、これを修正し、明確と同じポータブル意味を持つようにreinterpret_castは権限を与えますコードの次の行):
unsigned char *uc_ptr2 = static_cast<unsigned char*>(static_cast<void*>(uc_ptr));
しかし、すべての実用的な目的のために、C ++ 03標準が問題に多少曖昧であると考えられているにもかかわらず、(それほどクラス型のポインタを変換する際に、しかし、unsigned char型」に非クラス型のポインタを変換するとき
:あなたはとてもとしてreinterpret_cast
使用しない場合* ')、ほとんどの実装は、正しいことを行います
unsigned char *uc_ptr2 = reinterpret_cast<void*>(uc_ptr);
私はあなたの構造体は、任意のバイトで整列させることができる符号なしの文字が含まれていますので、あなたは、アライメントの問題と問題ないはずなので、コンパイラはメンバー間の任意のパッキンを挿入します(ただし厳密ではないだろうと思われる、これはそう、実装依存であります)注意して使用します。
この場合、reinterpret_cast
にunsigned char*
でキャストする動作が保証され、あなたのタイプは、いわゆるPOD構造体(おおよそ、Cの構造体)であるため、第一unsigned char
データメンバーを指します。
(あなたが見てみたい場合9.2/17
から、)標準の引用
POD-構造体オブジェクトへのポインタは、適切reinterpret_castはを用いて変換し、その最初のメンバーを指す(またはそのメンバーは、ビットフィールドがある場合、それが存在する単位へ)またはその逆。 [注:適切なアラインメントを達成するために、必要に応じてそのためではなく、その先頭に、POD-Structオブジェクト内の無名のパディングがあるかもしれません。
したがって、次の作品
unsigned char * uc_ptr2 = reinterpret_cast<unsigned char*>(uc_ptr);
あなたはポインタにunsigned char型のアドレス(回答の一部が前提とされる)または実際の構造体に構造体のアドレスを変換したいですか?かつての場合は、ここではいくつかの可能性があります:
unsigned char * uc_ptr2 = static_cast<unsigned char *>(static_cast<void *>(uc_ptr));
unsigned char * uc_ptr2 = reinterpret_cast<unsigned char *>(uc_ptr);
unsigned char * uc_ptr2 = (unsigned char *)uc_ptr;
:後者の場合は、あなたはのいずれかを使用することができます
unsigned char * uc_ptr2 = *static_cast<unsigned char **>(static_cast<void *>(uc_ptr));
unsigned char * uc_ptr2 = *reinterpret_cast<unsigned char **>(uc_ptr);
unsigned char * uc_ptr2 = *(unsigned char **)uc_ptr;
1つのオプションは、逆を行うことです。最初にバッファリングして、このバッファの上に、あなたのオブジェクトを割り当てるために、新たな配置を使用して「* unsigned char型」あなたを作成します。
#include <iostream>
struct uchar_t {
unsigned char uc1;
unsigned char uc2;
unsigned char uc3;
unsigned char uc4;
unsigned char uc5;
unsigned char uc6;
};
int main ()
{
unsigned char * buffer
= new unsigned char[ sizeof (uchar_t)/sizeof (unsigned char) ];
uchar_t * uc = new (buffer) uchar_t ();
uc->uc3 = 'a';
std::cout << buffer[2] << std::endl;
delete buffer;
}