2
int p = (int *)malloc(sizeof(int));

と、

int p = (int)malloc(sizeof(int));

内部で何が起こっているのか、 と の使用の違いを誰かに説明してもらえます(int*)(int)? ありがとう。

4

5 に答える 5

6

これは 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
于 2013-04-30T21:52:00.977 に答える
2

割り当ては次のとおりです。

int * p = (int *)malloc(sizeof(int));

malloc は void * (常にポインター) を返します。これを int * などの適切なポインター型にキャストする必要があります。メモリリークを防ぐために、割り当てられたメモリを使用し終わったら free() することも重要です。ヒープにintを割り当てたい/必要とするケースはほとんどないため、あなたの例は学術的であると思います。

于 2013-04-30T21:38:15.423 に答える