int p = (int *)malloc(sizeof(int));
と、
int p = (int)malloc(sizeof(int));
内部で何が起こっているのか、 と の使用の違いを誰かに説明してもらえます(int*)
か(int)
? ありがとう。
これは C++ とタグ付けされているので、C++ の角度から答えを導き出します。
int p = (int *)malloc(sizeof(int));
int p = (int)malloc(sizeof(int));
これらはどちらも間違っています。malloc はメモリへのポインタを返します。あなたが実際に望んでいたのは、ヒープに int を割り当てることだったと思います。したがって、戻り値は int* です。
32 ビットまたは 64 ビットのアーキテクチャによっては、64 ビットのデータを 32 ビットのストレージに割り当てるため、このコードは壊れます。
C での正しい方法は次のとおりです。
int* p = malloc(sizeof(int));
つまり、int型に十分なスペースを割り当て、この割り当てられたスペースへのポインターを格納します。C ではキャストは必要ありません。
C++ で malloc を使用すると、次のようになります。
int* p = static_cast<int*>(malloc(sizeof(int)));
キャストが必要になりましたが、演算子 new を使用してこれを回避できます。
int* p = new int; // much cleaner!
演算子 new は、失敗時に nullptr/0/NULL を返すのではなく、std::bad_alloc をスローすることに注意してください。
スローしたくないが、よりクリーンな構文が必要な場合は、次を使用できます。
int* p = new (std::nothrow) int;
または、さらに良いことに、本当に必要な場合を除き、ヒープに割り当てないか、スマート ポインターを使用して、オペレーターの delete または free() の呼び出しについて心配する必要がないようにします。
std::unique_ptr<int> p(new int); // when p leaves scope, the memory is deleted
割り当ては次のとおりです。
int * p = (int *)malloc(sizeof(int));
malloc は void * (常にポインター) を返します。これを int * などの適切なポインター型にキャストする必要があります。メモリリークを防ぐために、割り当てられたメモリを使用し終わったら free() することも重要です。ヒープにintを割り当てたい/必要とするケースはほとんどないため、あなたの例は学術的であると思います。