配列にメモリを割り当てるには2つの方法があり、サイズは最初は不明です。最も一般的な方法は、このようにmalloc
を使用することです
int * array;
... // when we know the size
array = malloc(size*sizeof(int));
しかし、サイズがわかった後で配列を定義することは、C99でも有効です。
... // when we know the size
int array[size];
それらは絶対に同じですか?
いいえ、まったく同じではありません。どちらでも同じ数とタイプのオブジェクトを保存できますが、次のことに注意してください。
free()
することはできますが、可変長配列をfree()
することはできません(ただし、範囲外になり、外側のブロックが残されると存在しなくなります)。技術的な専門用語では、それらにはストレージ期間があります:m-allocのallocatedと可変長配列のautomaticです。malloc
はheapから割り当てます。これは、スタック制限のあるシステムでの問題です。多くの組み込みオペレーティングシステム。スタックサイズはkBのオーダーですが、ヒープははるかに大きくなります。malloc
を使用すると、可変長配列を使用するよりも、割り当ての失敗を簡単にテストできます。realloc()
で変更できますが、VLAは変更できません(正確には、異なる配列次元でブロックを再度実行することによってのみ、以前の内容が失われます)。malloc()
のみをサポートします。__STDC_NO_VLA__
を整数1として定義する必要があります)。