Вопрос по c++ – Неверное преобразование из «void *» в «unsigned char *»

6

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

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

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

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

Почему я получаю эту ошибку, я подумал, что пустота была & quot; type-less & quot; так что это может указывать на что-либо, или что-либо может указывать на это?

Ваш Ответ

6   ответов
0

void *pt; 

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

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

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

Также, технически, «внешняя» С »; int * & quot; и & quot; int * & quot; бывают разные типы ... (например, компилятор соляриса выберет это)

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

Обычное приведение против static_cast против dynamic_cast.

9

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

Вам нужно будет сделать

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

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

Чтобы узнать больше о пустых указателях, взгляните на6.13 & # x2014; Пустые указатели.

4

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

5

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

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

Похожие вопросы