web-dev-qa-db-ja.com

malloced arrayVS。可変長配列

配列にメモリを割り当てるには2つの方法があり、サイズは最初は不明です。最も一般的な方法は、このようにmallocを使用することです

int * array;
... // when we know the size
array = malloc(size*sizeof(int));

しかし、サイズがわかった後で配列を定義することは、C99でも有効です。

... // when we know the size
int array[size];

それらは絶対に同じですか?

32
linusz

いいえ、まったく同じではありません。どちらでも同じ数とタイプのオブジェクトを保存できますが、次のことに注意してください。

  • 割り当てられた配列をfree()することはできますが、可変長配列をfree()することはできません(ただし、範囲外になり、外側のブロックが残されると存在しなくなります)。技術的な専門用語では、それらにはストレージ期間があります:m-allocのallocatedと可変長配列のautomaticです。
  • Cにはstackの概念はありませんが、多くの実装ではスタックから可変長配列を割り当てますが、mallocheapから割り当てます。これは、スタック制限のあるシステムでの問題です。多くの組み込みオペレーティングシステム。スタックサイズはkBのオーダーですが、ヒープははるかに大きくなります。
  • mallocを使用すると、可変長配列を使用するよりも、割り当ての失敗を簡単にテストできます。
  • mallocで割り当てられたメモリのサイズはrealloc()で変更できますが、VLAは変更できません(正確には、異なる配列次元でブロックを再度実行することによってのみ、以前の内容が失われます)。
  • ホストされたC89実装はmalloc()のみをサポートします。
  • ホストされたC11実装は、可変長配列をサポートしない場合があります(C11 6.10.8.3に従って、__STDC_NO_VLA__を整数1として定義する必要があります)。
  • 私が逃した他のすべて:-)
38
Jens