2011-02-24 11 views
40

私は5行目にエラーが発生して、以下のコードに問題を抱えている:私はコードブロックで++グラムを使用していると私はcppのファイルとしてこのファイルをコンパイルしようとしたmallocを使用しているときに `void * 'から` char *'への変換が無効ですか?

error: invalid conversion from void* to char*

。それは問題ですか? C++で

#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"); 
} 
+2

はい、重要です。 http://david.tribble.com/text/cdiffs.htm#C99-void-ptrを参照してください。 –

+25

あらかじめお詫び申し上げます。申し訳ありませんが、**はC++ **をコンパイルしません。彼らは同じ言語ではありません。 –

+1

この質問は、 'c'と' C++'の両方にタグ付けされています。 1つを選んでから、他のタグを削除してください。 –

答えて

76

、私は、これはmalloc関数とラインであると仮定しmalloc()

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

C言語では、C言語ではありません。 – Marlon

+2

Cコードを書いている人なら、ファイル名に.c拡張子を使用すればよいでしょう。 – karlphillip

+0

ありがとうございました。私はこれを12分で解答します。 – pandoragami

4

のリターンをキャストする必要があります。ちょうどその結果をキャスト - char *foo = (char*)...

20

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

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

4

あなたの意図は何ですか?あなたはCプログラムやC++プログラムを書こうとしていますか?

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

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

関連する問題