2012-04-14 3 views
6

У меня есть следующий код;Неверное преобразование из 'void *' в 'unsigned char *'

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

У меня возникает следующая ошибка для этой строки при попытке скомпилировать;

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

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

ответ

9

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

Вы должны были бы сделать

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

(хотя вы можете использовать static_cast также)

Чтобы узнать больше о недействительных указателей, посмотрите на 6.13 — Void pointers.

0
void *pt; 

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

Вот как я это сделаю.

+0

О :(Я думал, что вы могли бы, хотя я мог бы выделить X-байты в памяти для последующего использования, потому что 10-байтовый символ или 10-байтовый int являются как 10 байтами, не относящимися к значениям выделенных 10 байтов. Это не так? – jwbensley

+0

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

4

Вы можете конвертировать любой указатель в void *, но вы не можете преобразовать void * во что-либо еще без трансляции. Это может помочь представить, что «void» является базовым классом для ВСЕГО, а «int» и «char» и еще не все подклассы «void».

1

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

Кроме того, технически, «Экстерн„C“INT *» и «INT *» являются различные типы ... (как соляриса компилятор подберут это)

Я хотел бы предложить вам, используя C++ стиль отбрасывать вместо C cast. Здесь представлено больше описаний:

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 оператор и броски являются небезопасными, труднодоступными и затрудняют понимание вашей программы. Избегайте их, если это возможно.