从“无效*”无效转换为“无符号字符*”(Invalid conversion from ‘void*

2019-07-29 00:02发布

我有以下代码;

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

我得到了在编译的时候该行下面的错误;

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

为什么我得到这个错误,我想到了一个空洞是“类型少”,因此它可以在任何点,或什么都可以指向它?

Answer 1:

你需要转换,你不能一个void *转换成任何东西,而不第一投射它。

你需要做的

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

(虽然你可以使用static_cast也)

要了解更多关于空指针,看看6.13 -空指针 。



Answer 2:

一个void*可能指向任何东西,你可以将指针转换为其他任何一个void*不进行强制转换,但你必须使用static_cast做相反。

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

如果你想100的动态分配的缓冲区unsigned char ,你是关闭这样做,避免投好。

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


Answer 3:

您可以将任何指针转换为void *,但你不能void *的转换到别的没有一个演员。 这可能有助于想象,“空缺”是一切的基类,以及“Int”和“字符”和诸如此类的东西是所有子类“空白”。



Answer 4:

这是一个有点横向思维:当你认为你需要铸件或指针,再想一想。 如果你需要的是内存,采用100张无符号数

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

要么

unsigned char data[100];

如果大小不恒定,使用矢量:

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

裸指针,在new运营商和强制转换是不安全的,很难得到正确和使你的程序更难理解。 如果可能的话避开他们。



Answer 5:

C ++的设计是更有型比C安全的,如果这是C代码,它可能是好的,但也取决于你使用现在什么编译器。

另外,从技术上讲,“外部的‘C’INT *”和“INT *”是不同类型的...(如Solaris编译器会挑了这一点)

我想用C ++风格的转换而不是C铸建议你。 这里还有更多的说明:

定期投与的static_cast dynamic_cast的对比 。



Answer 6:

void *pt; 

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

这是我会怎么做。



文章来源: Invalid conversion from ‘void*’ to ‘unsigned char*’