2012-04-14 47 views
6

次のコードがあります。'void *'から 'unsigned char *'への無効な変換

void* buffer = operator new(100); 
unsigned char* etherhead = buffer; 

コンパイル時に次のエラーが発生します。

error: invalid conversion from ‘void*’ to ‘unsigned char*’ 

私はエラーが出るのはなぜ、私はそれが何を指し示すことができ、または何かがそれを指し示すことができるようにボイドは「タイプレス」だと思いましたか?

答えて

9

void *を最初にキャストせずに何かに変換できないので、キャストする必要があります。

6.13 — Void pointersを見て、空ポインタの詳細については

を(あなたもstatic_castを使用することができますが)あなたは

unsigned char* etherhead = (unsigned char*)buffer; 

を行う必要があります。

0
void *pt; 

pt=(void*)&i; 
pt=(void*)&dbl; 

これはどのように行うのですか。

+0

ああ、10バイトのcharまたは10バイトのintが10バイトの長さであり、alloted 10バイトの値に関係なく、後で使用するためにXバイトをメモリに割り当てることはできます。これは間違っていますか? – jwbensley

+0

メモリを再利用したいという魅力的な理由はありますか?そうでない場合は、プログラムを不必要に複雑にします。 – Philipp

4

任意のポインタをvoid *に変換できますが、void *をキャストなしのものに変換することはできません。 "void"はすべての基本クラスであり、 "int"と "char"などはすべて "void"のサブクラスです。

1

C++はCよりも型の安全性が高くなるように設計されています。これがCコードの場合は、問題ありませんが、現在使用しているコンパイラによって異なります。

また、技術的には、 "にextern "C" int型*" と "int型*" 異なったタイプです...(Solarisのコンパイラのようにこれを選ぶだろう)

私はキャストの代わりに、C++スタイルを使用して、あなたをお勧めしますCキャスト。ここにはさらに詳しい説明があります:

Regular cast vs. static_cast vs. dynamic_castです。

5

void*は何を指す可能性があり、あなたはキャストせずにvoid*に何か他のものへのポインタを変換することができますが、逆を行うためにstatic_castを使用する必要があります。

unsigned char* etherhead = static_cast<unsigned char*>(buffer); 

あなたが100 unsigned charの動的に割り当てられたバッファをしたい場合は、あなたがこれを行うとキャストを避けたほうが良いです。

unsigned char* p = new unsigned char[100]; 
3

ここでは横向きの考え方があります:キャストやポインタが必要だと思ったら、もう一度考えてみてください。あなたが必要とするすべては、メモリの100符号なしバイトの場合、

std::array<unsigned char, 100> data; 

または

unsigned char data[100]; 

を使用サイズが一定でない場合は、ベクトルを使用します。

std::vector<unsigned char> data(size); 

生のポインタ、new演算子、キャストは安全ではなく、正しい取得が難しく、プログラムを理解しにくくします。可能な場合は避けてください。

関連する問題