Error: Assigning to char* from incompatible type void*

Error: Assigning to char* from incompatible type void*

所以我试图将来自 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 进行编译。

发生这种情况是因为 C 对类型相当宽松,而 C++ 很严格。 malloc() returns void*,所以为了将它用作 char*,您需要转换它。

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

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

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

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

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

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

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