Недопустимое преобразование из 'void*’ в' unsigned char*’

у меня есть следующий код;

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

Я получаю следующую ошибку для этой строки при попытке компиляции;

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

почему я получаю эту ошибку, я думал, что пустота была "без типа", поэтому она может указывать на что угодно, или что-нибудь может указывать на нее?

6 ответов


вам нужно бросить, так как вы не можете преобразовать пустоту* во что-либо, не бросив ее сначала.

вы должны

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

(хотя вы могли бы использовать static_cast и)

чтобы узнать больше о указателях пустоты, взгляните на 6.13 - указатели Void.


A void* может указывать на что угодно, и вы можете преобразовать указатель на что угодно в void* без броска, но вы должны использовать static_cast сделать обратное.

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

если вы хотите динамически выделенный буфер 100 unsigned char вам лучше сделать это и избежать гипса.

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

вы можете преобразовать любой указатель в void *, но вы не можете преобразовать void * во что-либо еще без приведения. Это может помочь представить, что" void "является базовым классом для всего, а" int"," char "и т. д.-все подклассы "void"."


вот немного бокового мышления: всякий раз, когда вы думаете, что вам нужны слепки или указатели, подумайте еще раз. Если все, что вам нужно, это 100 байт памяти без знака, используйте

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

или

unsigned char data[100];

если размер не является постоянным, использовать вектор:

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

сырые указатели,new оператор, и слепки небезопасны, трудно получить право и сделать вашу программу труднее понять. Избегайте их, если это возможно.


C++ предназначен для более безопасного типа, чем C. Если это код C, это может быть нормально, но также зависит от того, какой компилятор вы используете прямо сейчас.

кроме того, технически "extern" C "int *" и "int *" - это разные типы... (например, компилятор solaris выберет это)

Я бы предложил вам использовать C++ style cast вместо C cast. Есть больше описаний здесь:

обычный бросок против static_cast против dynamic_cast.


void *pt; 

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

вот как я бы это сделал.