我有以下代码;
void* buffer = operator new(100);
unsigned char* etherhead = buffer;
我得到了在编译的时候该行下面的错误;
error: invalid conversion from ‘void*’ to ‘unsigned char*’
为什么我得到这个错误,我想到了一个空洞是“类型少”,因此它可以在任何点,或什么都可以指向它?
我有以下代码;
void* buffer = operator new(100);
unsigned char* etherhead = buffer;
我得到了在编译的时候该行下面的错误;
error: invalid conversion from ‘void*’ to ‘unsigned char*’
为什么我得到这个错误,我想到了一个空洞是“类型少”,因此它可以在任何点,或什么都可以指向它?
你需要转换,你不能一个void *转换成任何东西,而不第一投射它。
你需要做的
unsigned char* etherhead = (unsigned char*)buffer;
(虽然你可以使用static_cast
也)
要了解更多关于空指针,看看6.13 -空指针 。
一个void*
可能指向任何东西,你可以将指针转换为其他任何一个void*
不进行强制转换,但你必须使用static_cast
做相反。
unsigned char* etherhead = static_cast<unsigned char*>(buffer);
如果你想100的动态分配的缓冲区unsigned char
,你是关闭这样做,避免投好。
unsigned char* p = new unsigned char[100];
您可以将任何指针转换为void *,但你不能void *的转换到别的没有一个演员。 这可能有助于想象,“空缺”是一切的基类,以及“Int”和“字符”和诸如此类的东西是所有子类“空白”。
这是一个有点横向思维:当你认为你需要铸件或指针,再想一想。 如果你需要的是内存,采用100张无符号数
std::array<unsigned char, 100> data;
要么
unsigned char data[100];
如果大小不恒定,使用矢量:
std::vector<unsigned char> data(size);
裸指针,在new
运营商和强制转换是不安全的,很难得到正确和使你的程序更难理解。 如果可能的话避开他们。
C ++的设计是更有型比C安全的,如果这是C代码,它可能是好的,但也取决于你使用现在什么编译器。
另外,从技术上讲,“外部的‘C’INT *”和“INT *”是不同类型的...(如Solaris编译器会挑了这一点)
我想用C ++风格的转换而不是C铸建议你。 这里还有更多的说明:
定期投与的static_cast dynamic_cast的对比 。
void *pt;
pt=(void*)&i;
pt=(void*)&dbl;
这是我会怎么做。