6

私はCに頭を悩ませようとしています。K&Rを読んで、メモリのブロックを動的に取得する必要がある状況を示している場所を見つけようと前後にフリックしています。

たとえば、intポインタが必要です。

int *pointer;

しかし、K&Rは私がやりたいと思うかもしれないと述べています:

int *pointer;

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

基本的に、私はここで何をしましたか?最初のケースでは、まだ何も指していないポインタを作成したので、コンピュータのメモリが不足していると思います。int値を指すようにすると、問題が発生します。2番目のケースでは、ポインター用のスペースが予約されています。したがって、プログラムに多くのメモリの問題があることを心配する必要はありません。これは正しいです?これが正しければ、作成するすべてのポインターにmalloc(またはcalloc)を使用するべきではありませんか?私のプログラムの問題が少ないことを確認するためだけですか?

4

4 に答える 4

9

mallocメモリを割り当てるために使用されます。ポインターを使用するには、ポインターを割り当てるかmalloc、既に割り当てられているメモリの部分を指すようにします。

あなたが示した最初のケ​​ースでは、ポインターがアドレスを指すようにしない限り、それは割り当てられず、使用できません。たとえば、既存の int 値を指すようにすることができます。

int value = 0;
int* pointer;
pointer = &value;

ただし、値を保持するように割り当てることはできません。

int value = 0;
int* pointer;
*pointer = value; // wrong because pointer is not allocated

これが 2 番目のケースの目的です。

calloc基本的にmalloc+初期化です。

編集: とにかく、これは malloc の使用法の良い例ではありません。おそらく最適な使用法は、可変サイズの配列を割り当てる必要がある場合です (コンパイル時には不明です)。次に、次を使用する必要があります。

int* array = (int*)malloc(N * sizeof(int));

これは、次の 2 つの理由で役立ちます。

  1. N が変数の場合、次のような静的割り当てを行うことはできませんint array[N];
  2. スタックは、割り当てることができるスペースの量が制限される場合があります。
于 2011-12-11T14:34:54.330 に答える
3

最初のケースでは、整数へのポインターをスタックに割り当てました。それだけです。したがって、単一のポインターがあります。

2 番目のケースでは、整数へのポインターをスタックに割り当てました。次に、malloc を使用して、整数を保持するのに十分な大きさのメモリ ブロックを割り当て、整数へのポインタがその malloc() されたメモリを指すようにしました。したがって、ここには整数へのポインターと整数があります。

于 2011-12-11T14:32:25.293 に答える
0

最初のケース: 1 つの変数ポインターのみを宣言します。しかし、それに何も割り当てずに。それはただの宣言です。

しかし 2 番目のケース: メモリ 1 ポインターをヒープに割り当てます (ヒープに n 番目のポインターを作成できます) 必要な要素の数を倍にします。

ケース 1 とケース 2 の違いは、ケース 1 ではメモリがスタックに残り、プログラムの実行が終了することです。ただし、ケース 2 では、free(pointer) を使用していつでもメモリを解放 (再利用) できます。

于 2014-12-08T04:20:53.497 に答える
0

calloc または malloc を使用して、必要な場合にのみ (楽観的に) メモリを割り当てる必要があります。ポインタは、既存のメモリ位置を指す場合もあります。

于 2011-12-11T14:35:08.620 に答える