web-dev-qa-db-ja.com

mallocを使用している場合、「void *」から「char *」への無効な変換ですか?

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");
}
54
pandoragami

C++では、malloc()の戻り値をキャストする必要があります

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

C++はCよりも型安全であるように設計されているため、(自動的に)fromvoid*to別のポインタ型に変換できません。ファイルは.cppであるため、コンパイラはC++コードを予期しています。前述のように、char*void*に割り当てているため、mallocの呼び出しはコンパイルされません。

ファイルを.cに変更すると、Cコードが必要になります。 Cでは、void*と別のポインター型の間のキャストを指定する必要はありません。ファイルを.cに変更すると、正常にコンパイルされます。

23
Marlon

これはmallocのある行だと思います。結果をキャストします-char *foo = (char*)...

7
viraptor

それで、あなたの意図は何でしたか? CプログラムまたはC++プログラムを作成しようとしていますか?

Cプログラムが必要な場合は、C++としてコンパイルしないでください。つまり、ファイルに「.cpp」拡張子を付けたり、ファイルをCとして扱うようコンパイラーに明示的に依頼しないでください。C言語では、結果をキャストしないでください。 mallocの。質問に[C]のタグを付けたので、これが必要だと思います。

mallocを使用するC++プログラムが必要な場合、mallocの戻り値を適切な型に明示的にキャストする以外に選択肢はありません。

5
AnT