38

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

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

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

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

それらはまったく同じですか?

4

1 に答える 1

49

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

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