使用malloc时,从`void*'无效转换为`char*'?

pan*_*ami 55 c++ malloc g++

我在第5行的错误中遇到了以下代码的问题:

错误:无效转换void*char*

我正在使用g ++和codeblocks,我试图将此文件编译为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");
}
Run Code Online (Sandbox Code Playgroud)

kar*_*lip 105

在C++中,你需要转换返回 malloc()

char *foo = (char*)malloc(1);
Run Code Online (Sandbox Code Playgroud)

  • 在C++中你做,而不是用C. (30认同)
  • 只是想指出,许多人更喜欢使用C语言来表达,即使在C语言中也是如此,尤其是程序员在C和C++之间切换很多的工作组. (3认同)
  • 如果你正在编写C代码(而且你是),那么使用.c扩展名作为文件名,你会很好. (2认同)
  • @Karl Bielefeldt但如果它是作为一种风格问题而在C中做错了.不包括stdlib.h会导致malloc被隐式定义,返回一个int.如果强制转换隐含在int和某些指针之间,这将显示错误,但如果存在明确转换为正确类型,则不会显示错误.使用更安全的C形式肯定更好的风格? (2认同)

Mar*_*lon 23

C++的设计是更有型比C安全的,所以你不能(自动)转换 void* 另一个指针类型.由于您的文件是a .cpp,您的编译器需要C++代码,并且如前所述,您对malloc的调用将无法编译,因为您正在分配char*a void*.

如果您将文件更改为a,.c那么它将需要C代码.在C中,您不需要在void*其他指针类型之间指定强制转换.如果您将文件更改为a .c,它将成功编译.


vir*_*tor 7

我假设这是malloc的行。只需将结果转换为-char *foo = (char*)...


AnT*_*AnT 5

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

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

如果需要使用的C ++程序malloc,则别无选择,只能将的返回值显式malloc转换为适当的类型。