質問: 静的配列のサイズを変更する We have declared an array like below in our code. array is to be handled on the stack itself. we are not allocating any memory on heap with `malloc` or `new` ``` char a[20000]; ``` これで `20kb` ではなく `1800000(180kb)`に変更する必要があります。 以下のように: ``` char a[1800000]; ``` 我々はちょうどいくつかのデータで配列を埋めることです。 これは有効なことですか? 私たちが直面する可能性のある問題は何ですか? 私は値が大きすぎるように思えるだけです。 この必要性を回避するためのより良い方法はありますか? 私はsolaris unixプラットフォームで作業しています。
回答: いくつかの基本的な概念を明確にするために: 静的なキーワードがあり、静的な記憶期間があります。これは、変数がプログラムの実行中も保持され、変数のインスタンスが1つしか割り当てられないことを意味します。静的な保存期間を持つオブジェクトは、RAMの特定のセグメントに格納され、 .bss と呼ばれることがよくあります。 。静的またはファイルスコープ(グローバル)で宣言されたすべての変数は、静的な記憶期間を持ちます。静的記憶期間を持つ変数は、C/C ++標準によってゼロに初期化されることが保証されています。 スタックは、ローカル変数と関数パラメータが最も頻繁に割り当てられるRAMの動的部分です。スタックに割り当てられた変数は、通常自動的に変数と呼ばれ、コンパイラが自動的にこの変数を処理し、スタック上にある可能性のある最適な場所に割り当てますが、CPUレジスタやキャッシュメモリなどにも割り当てます。 C/C ++では `auto` というキーワードを使用する必要はありません。すべてのローカル変数とパラメータはデフォルトで自動です。自動ストレージを持つ変数には、明示的に初期化されない限り、ガベージ値が含まれます。 ヒープは、RAMのもう一つの動的部分です。これは、mallocまたは `new` で明示的に変数を割り当てるときにのみ使用されます。ヒープは、動的メモリ割り当て(フリーストア管理とも呼ばれます)について話すときに通常参照するものです。動的に割り当てられた変数には、明示的に初期化されない限り、ガベージ値が含まれます。 ほとんどのコンピュータでは、静的セグメントとヒープはRAMの量によってのみ制限されますが、スタックは固定サイズで制限されています。 Unixのようなマルチタスキングシステムでは、コンピュータのプロセスごとに1つのスタックが存在します。私はどのくらいの大きさの.bssやUnix/Solarisのスタックが可能かはわかりませんが、コンピュータの古さに依存していると思います。古いマシンではスタックに1.7MBの割り当てに問題がある可能性があります。私はUnixマシンについてはあまりよく分かりませんが、そのような大量のデータをすべてヒープ上に動的に割り当てることが推奨されています(これはPC上で行うことです)。