我有这个C ++代码:
#include <stdlib.h>
int main(){
char *Teclas;
Teclas = calloc(1024,sizeof(char));
}
编译器发出以下错误:
error: invalid conversion from `void*' to `char*'
这个错误是什么意思,我该如何解决?
答案 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