7

私は次のコードを持っています。

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

コンパイルしようとすると、その行で次のエラーが発生します。

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

なぜ私はそのエラーを受け取るのですか、ボイドは「タイプレス」であると思ったので、それは何でも指し示すことができます、または何かがそれを指すことができますか?

4

6 に答える 6

12

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

あなたがする必要があるでしょう

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

(ただし、使用することもできますstatic_cast

voidポインターの詳細については、6.13 —voidポインターを参照してください。


「型のない」状態はvoid*Cにのみ存在し、より強力な型安全性を備えたC++には存在しません。

于 2012-04-14T20:55:31.057 に答える
5

Avoid*は何かを指している可能性があり、他のポインタへのポインタをvoid*キャストなしでaに変換できますがstatic_cast、その逆を行うにはaを使用する必要があります。

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

動的に割り当てられた100のバッファーが必要なunsigned char場合は、これを実行してキャストを回避することをお勧めします。

unsigned char* p = new unsigned char[100];
于 2012-04-14T21:05:03.553 に答える
4

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

于 2012-04-14T20:54:02.430 に答える
3

ここに少し水平思考があります:キャストやポインターが必要だと思うときはいつでも、もう一度考えてください。必要なのが100の署名されていないバイトのメモリだけである場合は、

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

また

unsigned char data[100];

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

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

生のポインター、new演算子、およびキャストは安全ではなく、正しく理解するのが難しく、プログラムを理解しにくくします。可能であればそれらを避けてください。

于 2012-04-14T21:53:58.450 に答える
1

C ++は、Cよりもタイプセーフになるように設計されています。これがCコードの場合は問題ないかもしれませんが、現在使用しているコンパイラによっても異なります。

また、技術的には、「extern "C" int*」と「int*」は異なるタイプです...(solarisコンパイラがこれを選択するように)

Cキャストの代わりにC++スタイルのキャストを使用することをお勧めします。ここにもっと説明があります:

通常のキャストvs.static_castvs.dynamic_cast

于 2012-04-14T21:03:01.337 に答える
0
void *pt; 

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

これが私がそれをする方法です。

于 2012-04-14T20:52:50.257 に答える