7

ここでの動的メモリの議論について:「Cポインタと動的メモリの紹介」

著者は次のように述べています。

このようなメモリ ブロックは、より柔軟な配列として効果的に使用できます。このアプローチは、実際には実際の C プログラムではより一般的です。また、「可変サイズ配列」よりも予測可能で柔軟です。

彼が話しているメモリブロックのタイプは次のとおりです。

const int size = 5;
int * array = calloc(size, sizeof(int));

次に、別のポインターを使用して配列を反復処理します。

int * index = array;
for (i = 0; i < size; i++) {
    *index = 1; // or whatever value
    index++;
}

私の質問は、この方法が、このような標準の可変サイズの配列よりも優れている点です:

int array[variable];

または動的:

char name[] = "Nick";

著者は、私が後者よりも前者の方法を好む理由についてあまり明らかにしていません。またはより具体的には、どのように「予測可能で柔軟」になりますか?

4

5 に答える 5

11

メモリがスタックに割り当てられると宣言するint array[variable]と、大規模で比較的永続的なデータ構造 (戻りたいものなど) にはあまり適していません。配列構文を使用する場合、メモリはスコープ外になると解放されるため、手動でメモリを解放する必要はありません。calloc一方、実行時にヒープにメモリを動的に割り当てます。使い終わったらすぐに自分で解放する必要があります。

于 2009-01-15T23:04:00.477 に答える
8

が許可しないocdecioに同意します

int array[variable]

では、一部の型の変数と式を配列サイズにすることができます。しかし、それに加えて、 および ファミリで割り当てられたものは、mallocを使用してサイズ変更できますrealloc

于 2009-01-15T23:04:39.807 に答える
3

(calloc/malloc/new/etc を使用するヒープの代わりに) スタック上の可変サイズの配列を auto 変数として使用することは、長時間実行され、多くを作成および破棄する必要があるプロセスにとって悪い考えではありません。小さな配列の。これは、スタックが断片化されないことが保証されているのに対し、メモリは断片化される可能性があり、断片化されるためです。停止することなく何年も実行する必要があるファームウェアまたはサービスを作成している場合、malloc または new を使用することはほとんど禁止されています。

于 2011-07-25T22:42:33.533 に答える
0

なぜなら

int array[variable];

標準 C では有効ではありません。配列の長さは定数でしか定義できません。(あなたの

char name[] = "Nick";

可変長ではない例)。

そのため、プログラム変数に基づいた長さの配列を作成する場合は、calloc() のようなメモリ アロケータを使用する必要があります。

free() することを忘れないでください。

于 2009-01-15T23:04:07.327 に答える