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

hud*_*ero 7 c++ g++

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

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);
           ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*eyA 11

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


M.M*_*M.M 5

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

在代码中添加强制转换可以掩盖问题;即使它现在看起来有效,你真的不知道还会发生什么。

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

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