错误:从不兼容类型void *分配给char *

时间:2015-08-20 17:30:08

标签: c++ g++

所以我试图将来自libcURL HTTP请求的响应存储到稍后要解析的C字符串中。响应代码完全用C语言编写,而其他所有内容都是用C ++编写的,而且对于任何其他C ++编译器,它应该可以正常工作。但是当我尝试编译时,即使我给出了' -x c'参数后跟文件名,我得到了这些具体的答案。

g++ main.cpp -x c cJSON.c -x c respbuffer.c -lcurl -lm

./respbuffer.c:14:9: error: assigning to 'char *' from incompatible type 'void *'
    s->ptr = malloc(s->len+1);
           ^ ~~~~~~~~~~~~~~~~
./respbuffer.c:23:9: error: assigning to 'char *' from incompatible type 'void *'
    s->ptr = realloc(s->ptr, new_len+1);
           ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~

奇怪的是,只有在使用g ++进行编译时才会弹出此错误。如果我使用gcc,它运行正常,并且运行得足够顺畅。对于好奇,我在Xcode中编写了所有内容,并且我正在使用GCC 4.2.1进行编译。

3 个答案:

答案 0 :(得分:9)

这是因为C对类型非常宽松,而C ++是严格的。 malloc()返回void *,因此为了将其用作char *,您需要将其强制转换。

答案 1 :(得分:2)

在C中,malloc函数返回堆上的内存块void*。在C中它的一切正常,因为void*被隐式地转换为char*。 但是在C ++中它是被禁止的,所以你必须明确地施展它。

所以在这种情况下,正确的代码是:

s->ptr = static_cast<char*>(malloc(s->len+1));

答案 2 :(得分:0)

您不应该使用C ++编译器来编译C代码。这两种语言是不同的,C中正确的代码可能在C ++中默默地行为不端。

在代码中添加强制转换会掩盖问题;即使它现在似乎有用,你真的不知道还会发生什么。

在我的系统上,-x c导致g++实际调用C编译器。也许您有一些不支持该开关的g ++版本,或者g++可能是您系统上某些其他编译器的别名。

如果无法让-x c工作,请使用gcc作为编译器而不是g++。 (您需要对C文件使用单独的调用,而不是对C ++文件,然后是链接步骤。)