【问题标题】:invalid conversion from `void*' to `char*' when using malloc?使用 malloc 时从 `void*' 到 `char*' 的无效转换?
【发布时间】:2011-07-03 05:58:40
【问题描述】:

我在下面的代码中遇到问题,第 5 行出现错误:

错误:从void*char* 的无效转换

我正在使用带有代码块的 g++,并尝试将此文件编译为 cpp 文件。有关系吗?

#include <openssl/crypto.h>
int main()
{
    char *foo = malloc(1);
    if (!foo) {
        printf("malloc()");
        exit(1);
    }
    OPENSSL_cleanse(foo, 1);
    printf("cleaned one byte\n");
    OPENSSL_cleanse(foo, 0);
    printf("cleaned zero bytes\n");
}

【问题讨论】:

  • 是的,这很重要。见david.tribble.com/text/cdiffs.htm#C99-void-ptr
  • 对不起,大喊大叫,但请勿将 C 编译为 C++。它们不是同一种语言。
  • 这个问题被标记为cc++。请选择一个,然后删除另一个标签。

标签: c++ g++ malloc


【解决方案1】:

在 C++ 中,您需要将malloc() 的返回值强制转换

char *foo = (char*)malloc(1);

【讨论】:

  • 如果您正在编写 C 代码(并且您是),那么使用 .c 扩展名作为文件名,您会很好的。
  • @lost_with_coding - 如果您使用 C++,请不要标记它[c]。正如这个答案清楚地表明的那样,你不一样。
  • 只是想指出,即使在 C 语言中,出于风格问题,许多人也更喜欢明确的演员表,尤其是那些在 C 和 C++ 之间切换很多的程序员的工作组。
  • @Karl Bielefeldt 但是如果按照风格来做,那么在 C 中做的事情是错误的。不包括 stdlib.h 会导致 malloc 被隐式定义并返回一个 int。如果强制转换在 int 和某个指针之间是隐式的,这将显示错误,但如果有显式强制转换为正确类型,则不会显示错误。使用更安全的 C 形式肯定是更好的风格?
  • 实际上,在 C++ 中,您应该使用malloc,而是使用new
【解决方案2】:

C++ 被设计为比 C 更安全,因此您不能(自动)将 from void* to 转换为另一种指针类型。由于您的文件是 .cpp,因此您的编译器需要 C++ 代码,并且如前所述,您对 malloc 的调用将不会编译,因为您将 char* 分配给 void*

如果您将文件更改为.c,那么它将需要 C 代码。在 C 中,您不需要在 void* 和另一个指针类型之间指定转换。如果您将文件更改为.c,它将成功编译。

【讨论】:

    【解决方案3】:

    我认为这是 malloc 的路线。只需投射结果 - char *foo = (char*)...

    【讨论】:

      【解决方案4】:

      那么,你的意图是什么?您是在尝试编写 C 程序还是 C++ 程序?

      如果您需要 C 程序,则不要将其编译为 C++,即不要给您的文件提供“.cpp”扩展名或明确要求编译器将您的文件视为 C。在 C 语言中,您不应该转换malloc 的结果。我认为这是您所需要的,因为您将问题标记为 [C]。

      如果您需要使用malloc 的C++ 程序,那么您别无选择,只能将malloc 的返回值显式转换为正确的类型。

      【讨论】:

        猜你喜欢
        • 2014-06-09
        • 1970-01-01
        • 2023-03-16
        • 2012-04-26
        • 2016-03-21
        • 1970-01-01
        • 2017-06-30
        • 2017-02-17
        • 2017-04-15
        相关资源
        最近更新 更多