25

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

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

char charArray[50];

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

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

char anotherCharArray[someVariable + 50];

これもスタックに入れられますか?これをfree()すると、コードがsegfaultsになると確信しているので、そう思われるかもしれませんが、私にはあまり意味がありません。同様に、データがmallocを介して割り当てられたときにfree()を使用する必要がある100%唯一の状況ですか?

よろしくお願いします。

4

2 に答える 2

16

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

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

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

、またはfree()で割り当てられていないものはありません。単純。一部の関数は、上記のいずれかの使用を意味する場合があります (例: POSIX ) 。malloc()calloc()realloc()strdup()

于 2012-10-13T15:43:33.480 に答える
6

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

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

char anotherCharArray[someVariable + 50];

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

はい。_ はい、これは有効なコードですが、C99 の標準のみです。

于 2012-10-13T15:39:29.573 に答える