2

我有这个 C++ 代码:

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

并且编译器给出以下错误:

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

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

4

6 回答 6

16

问题是您正在尝试使用 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改为使用。

于 2013-09-18T18:15:58.513 回答
1

calloc()返回一个 void*。您需要将其值转换为 Teclas 的任何类型,这似乎是char*. 所以Teclas = (char*)calloc(...)

于 2013-09-18T18:14:27.620 回答
1
void int main(int argc,char *argv[])

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

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


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

于 2013-09-18T18:19:13.637 回答
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,但是你释放它并出于某种原因再次调用它。我认为你的意思是让它成为一个 do while 循环,但没有do.

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

于 2013-09-18T18:17:08.237 回答
0

在 android NDK JNI 上,即使使用类型转换、旧样式或新样式,错误仍然没有消失。

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

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

项目 -> 属性 -> C/C++ 常规 -> 路径和符号

在 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

于 2014-09-26T06:27:10.967 回答
0

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

于 2018-06-26T12:45:01.537 回答