C ++错误:从'void *'到'char *'的转换无效

时间:2013-09-18 18:10:45

标签: c++

我有这个C ++代码:

#include <stdlib.h>
int main(){
    char *Teclas;
    Teclas = calloc(1024,sizeof(char));
}

编译器发出以下错误:

error: invalid conversion from `void*' to `char*'

这个错误是什么意思,我该如何解决?

6 个答案:

答案 0 :(得分:11)

问题是您正在尝试使用C ++编译器编译C语言。正如错误消息所示,这一行:

Teclas = calloc(1024,sizeof(char));

尝试将void*返回的无类型calloc指针转换为类型char*指针,以指定该类型的变量。这种转换在C中有效,但在C ++中无效。

解决方案是使用C编译器。看起来您正在使用GCC,因此只需将源文件重命名为something.c,然后使用gcc而不是g++进行构建。

如果你真的必须使用编译器来处理错误的语言,并且不想在惯用的C ++中重写它,那么你需要一个强制转换来强制它通过编译器:

Teclas = static_cast<char*>(calloc(1024,sizeof(char)));

或者,如果您希望代码保持有效C:

Teclas = (char*)calloc(1024,sizeof(char));

但不要那样做:为语言使用正确的编译器。除非这是将程序转换为C ++的第一个阶段;在这种情况下,接下来要做的就是摆脱这些分配并改为使用std::string

答案 1 :(得分:2)

void int main(int argc,char *argv[])

嗯...也许只是int main(int argc, char *argv[]) ...

除此之外:这看起来像C代码。这些行中没有任何内容表明您使用C ++。您看到的错误是将C代码视为C ++的结果,而不是C ++,因为C不是C ++,C ++不是C,也不是另一个的子集。


使用C编译器编译C代码。

答案 2 :(得分:1)

calloc()返回void *。您需要将其值转换为Teclas的任何类型,它看起来像char*。所以Teclas = (char*)calloc(...)

答案 3 :(得分:0)

最好的解决方案是使用C编译器编译代码,因为这是C代码。你真的不应该编译C代码,就好像它是C ++一样。但是,要直接回答您的问题,您可以强制C ++编译器编译您的C代码(这非常糟糕!!!!)。

在C ++中,无论何时使用alloc族的任何函数,都必须将返回值强制转换为左值的类型。所以,在这种情况下:

Teclas = (char*)calloc(1024, sizeof(char));

我这样做的方式是这样的:

Teclas = (char*)malloc(1024 * sizeof(*Teclas));

这里的好处:如果您更改Teclas的类型,您仍然会得到正确的分配大小。另外,我更喜欢一般使用malloc

此外,您的代码中存在重大问题。首先,void int main(...) ????并且你永远不会在打印它之前初始化Teclas的内容,但你释放它并因某种原因再次调用它。我认为你的意思是做一个while while循环,但是没有do

此外,void KeyLogger();错误。这就是你声明函数的方式,但由于它是一个声明,它应该在main之外。

答案 4 :(得分:0)

在Android NDK JNI上,即使使用类型转换,旧样式或新样式,错误仍然无法消失。

buffer = (char *) malloc(10);
xxxx=static_cast<char*>(calloc(1024,sizeof(char)));

要使错误消失,需要在路径和符号中添加额外的包含。

项目 - &gt;属性 - &gt; C / C ++通用 - &gt;路径和符号

在Includes选项卡/ GNU C ++上,添加以下路径(使用相应的gcc版本4.6,4.8 ......)当然在Windows上,路径将是一个Windows路径....

{NDKROOT} /toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.6/include

答案 5 :(得分:0)

如果可以确保代码中没有其他错误,则可以添加g ++标志:-fpermissive,以将错误置于警告中。
exp:g++ -fpermissive yourcode.cpp