Недопустимое преобразование из '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. Есть больше описаний здесь: