我有以下代码;
void* buffer = operator new(100);
unsigned char* etherhead = buffer;
我在尝试编译时遇到以下错误;
error: invalid conversion from ‘void*’ to ‘unsigned char*’
为什么我会收到这个错误,我认为一个空白是“无类型”所以它可以指向任何东西,或任何东西可以指向它?
答案 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。这里有更多描述:
答案 5 :(得分:0)
void *pt;
pt=(void*)&i;
pt=(void*)&dbl;
我将如何做到这一点。