从'void *'到'unsigned char *'的转换无效

时间:2012-04-14 20:50:53

标签: c++ void-pointers unsigned-char

我有以下代码;

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

我在尝试编译时遇到以下错误;

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

为什么我会收到这个错误,我认为一个空白是“无类型”所以它可以指向任何东西,或任何东西可以指向它?

6 个答案:

答案 0 :(得分:9)

你需要施放,因为你不能先将void *转换为任何东西而不先将其强制转换。

你需要做

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

(虽然您也可以使用static_cast

要了解有关void指针的更多信息,请查看6.13 — Void pointers

答案 1 :(得分:5)

void*可能指向任何内容,您可以将指针转换为void*而无需转换,但您必须使用static_cast执行相反操作。

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

如果你想要一个100 unsigned char的动态分配缓冲区,你最好这样做并避免演员。

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

答案 2 :(得分:4)

您可以将任何指针转换为void *,但是如果没有强制转换,您无法将void *转换为其他任何指针。可能有助于想象“void”是一切的基类,“int”和“char”以及诸如“void”的所有子类。

答案 3 :(得分:3)

这里有一些侧面思考:每当你认为你需要演员或指针时,再想一想。如果您只需要100个无符号字节的内存,请使用

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

unsigned char data[100];

如果大小不是常数,请使用向量:

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

原始指针,new运算符和强制转换是不安全的,很难做到并使您的程序更难理解。如果可能,请避免使用它们。

答案 4 :(得分:1)

C ++被设计为比C更安全。如果这是C代码,它可能没问题,但也取决于你现在使用的编译器。

另外,从技术上讲,“extern”C“int *”和“int *”是不同的类型......(就像solaris编译器会选择它一样)

我建议你使用C ++样式而不是C cast。这里有更多描述:

Regular cast vs. static_cast vs. dynamic_cast

答案 5 :(得分:0)

void *pt; 

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

我将如何做到这一点。