2

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
4

9 に答える 9

7

static_castタイプ間に関係がないため、ここでは使用できません。を使用する必要がありますreinterpret_cast

基本的に、static_castほとんどの場合 a を使用する必要があり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 );
}
于 2009-07-08T04:06:43.447 に答える
4

構造体のパッキングの違いにより、最初に配列を使用するか、名前で構造体メンバーから一度に1つずつ新しい配列を埋めるコードを記述しない限り、これを確実かつ移植可能に行うことはできません。reinterpret_castは、あるコンパイラ/プラットフォーム/バージョンで機能し、別のコンパイラ/プラットフォーム/バージョンで機能しない場合があります。

ヒープまたはスタックに配列を割り当ててから、1つずつ配列を埋める方がよいでしょう。

于 2009-07-08T04:25:50.460 に答える
2

試してみてくださいreinterpret_cast<unsigned char*>static_cast基本クラスから派生クラスへの変換など、互換性のある型の間で変換するためのものです。reinterpret_cast関係のない型間のキャスト用です。

于 2009-07-08T04:06:07.957 に答える
1

簡単にどうですか:

unsigned char * uc_ptr2 = &uc_ptr->uc1;
于 2009-07-08T04:53:20.683 に答える
1

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);

構造体には任意のバイトにアラインできる unsigned char が含まれているため、アラインメントの問題は問題ないと思います。そのため、コンパイラはメンバー間にパッキングを挿入しません (ただし、厳密に言えば、これは実装に依存するため、注意してください)。 .

于 2009-07-08T04:54:01.370 に答える
1

この場合、型がいわゆる POD 構造体 (大まかに言えば C 構造体) であるため、reinterpret_castto を使用したキャストunsigned char*は確実に機能し、最初のデータ メンバーを指します。unsigned char

標準の引用 (9.2/17見たい場合は から)

reinterpret_cast を使用して適切に変換された POD 構造体オブジェクトへのポインターは、その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。[注: したがって、POD 構造体オブジェクト内に名前のないパディングがある場合がありますが、適切な配置を実現するために必要に応じて、先頭にはありません。]

したがって、次のように動作します

unsigned char * uc_ptr2 = reinterpret_cast<unsigned char*>(uc_ptr);
于 2009-07-08T05:18:16.530 に答える
1

次の代わりに、なぜこのような奇妙な構造体を使用するのでしょうか。

unsigned char uc[5];

これは、uc[0]、uc[1]、uc[2]、uc[3]、uc[4] として個別にアドレス指定でき、集約へのポインター (おそらく unsigned char * で必要なもの) によって、" uc」。

メンバー名に番号が付けられた複数の unsigned char メンバーを持つ構造体よりもはるかに単純に思えます (ところで、uc4 に何が起こったのでしょうか? -- 配列ソリューションが回避する別のエラーです)。

于 2009-07-08T04:16:16.220 に答える
0

構造体のアドレスを 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;
于 2009-07-08T06:01:57.863 に答える
0

1 つのオプションは、逆を行うことです。最初に「unsigned char *」バッファを作成してから、placement new を使用して、このバッファの上にオブジェクトを割り当てます。

#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;
}
于 2009-07-08T10:34:53.583 に答える