web-dev-qa-db-ja.com

C配列のインスタンス化-スタックまたはヒープの割り当て?

私はこの質問が以前に尋ねられたことを保証しますが、検索でそれを見つけることができませんでした。冗長性については事前に申し訳ありません。

コンパイル時にオブジェクトのサイズがわかっている場合にのみスタックに割り当てるというのは私の考えです(間違っている可能性があります)。したがって、配列を初期化する場合は、次のいずれかを実行できます(これはスタックに配置する必要があります)。

char charArray[50];

この配列のサイズはコンパイル時にわかっているため、問題はありません。

一方、これ(私は信じています)も有効なコードです:

char anotherCharArray[someVariable + 50];

これもスタックに入りますか?これをfree()するとコードがセグメンテーション違反を起こすと確信しています。同様に、データがmallocを介して割り当てられたときにfree()を使用する必要がある唯一の状況は何ですか?

よろしくお願いします。

18
Shookit

同様に、データがmallocを介して割り当てられたときにfree()を使用する必要がある唯一の状況は何ですか?

はい。 (callocとreallocは別として、それらの戻り値もfree() 'dになります。同様に、malloc()を使用する関数があり、この事実が文書化されています。たとえば、strdup()-これらの関数の戻り値も、​​明らかにfree()を使用して解放する必要があります。)

char anotherCharArray[someVariable + 50];

これもスタックに入りますか?

はい、あります(ほとんどの実装では-もちろん、alwaysではありませんが、ほとんどのプラットフォームではそうです)。はい、これは有効なコードですが、C99の標準にすぎません。

6
user529758

_char charArray[50];_が(すべての関数の外で)ファイルスコープで定義されている場合、またはstaticである場合、それはスタックに置かれず、プログラムの開始変数で事前に割り当てられたグローバルになります。 staticではなく、関数スコープで定義されている場合、スタックに配置されます。

_char anotherCharArray[someVariable + 50];_は関数スコープでのみ定義でき、スタックに置かれます。

上記のすべてがCの一般的な実装に適用されます。一般的な実装では、スタックの代わりに、プログラムのデータセクション内の事前に割り当てられたスペースの代わりにヒープを使用できます。

free()malloc()、またはcalloc()で割り当てられていないものはrealloc()ではありません。シンプル。一部の機能は、上記のいずれかの使用を意味する場合があります。 POSIX strdup()

8
Alexey Frunze