私のアルゴリズムでは、動的配列ではなく静的配列で動作することを知っています。しかし、私は時々スタックの限界に達します。私は正しいですか、その静的配列はスタックに格納されていますか?
1つのCプログラムの最大スタックサイズに影響するパラメータはどれですか?
最大アレイサイズに影響を与える多くのシステムパラメータはありますか?最大数はありませんか。要素の数は配列タイプに依存しますか?システムRAM全体に依存しますか?または、すべてのCプログラムに静的な最大スタックサイズがありますか?
私は正しいですか、その静的配列はスタックに格納されていますか?
いいえ、static
アレイは静的ストレージ領域に格納されます。自動のもの(つまり、関数内で宣言され、static
ストレージ指定子がないもの)はスタックに割り当てられます。
1つのCプログラムの最大スタックサイズに影響を与えるパラメーターはどれですか?
これはシステムに依存します。一部のオペレーティングシステムでは、プログラムでスタックサイズを変更できます。
自動ストレージ割り当てが原因でスタックスペースが不足していることは、メモリ戦略を再検討する必要があることを明確に示しています。再入可能性が問題にならない場合は、静的ストレージ領域にバッファを割り当てるか、最大のメモリ割り当てに動的割り当てを使用する必要があります。あなたのアレイの。
実際には、使用するプラットフォームのCコンパイラによって異なります。
例として、実際のスタックを持たないシステムもあるため、再帰は機能しません。
静的配列は、ポインタを含む連続メモリ領域としてコンパイルされます。ポインタのサイズは2バイトまたは4バイト(またはエキゾチックなプラットフォームでは1バイトのみ)の場合があります。
サイズ(そしてもちろん速度)が異なる「近い」ポインタと「遠い」ポインタを持つメモリページを使用するプラットフォームがあります。したがって、配列とオブジェクトを表すポインタが同じメモリページに収まる必要がある場合があります。
組み込みシステムでは、静的データは通常、メモリ領域に収集され、後で読み取り専用メモリによって表されます。したがって、アレイはそこに収まる必要があります。
任意のアプリケーションを実行するプラットフォームでは、上記のいずれにも当てはまらない場合、RAMが制限要因になります。
あなたの質問のほとんどは答えられました、しかしただ私の人生をずっと楽にしてくれた答えを与えるために:
定性的に、動的に割り当てられていないアレイの最大サイズは、使用しているRAMの量によって異なります。また、配列のタイプによっても異なります。たとえば、anint
は4バイト、doubleは8バイト(システムにも依存します)であるため、次を使用すると、要素数が2倍になる配列を作成できます。int
の代わりにdouble
。
そうは言っても、数字が実際に重要な場合があることを念頭に置いて、システム内の最大数を抽出するのに役立つ非常にわかりにくいコードスニペットを次に示します。
#include <stdio.h>
#include <stdlib.h>
#define UPPER_LIMIT 10000000000000 // a very big number
int main (int argc, const char * argv[])
{
long int_size = sizeof(int);
for (int i = 1; i < UPPER_LIMIT; i++)
{
int c[i];
for (int j = 0; j < i; j++)
{
c[j] = j;
}
printf("You can set the array size at %d, which means %ld bytes. \n", c[i-1], int_size*c[i-1]);
}
}
PS:システムの最大値に到達し、予想されるセグメンテーション違反が発生するまでに時間がかかる場合があるため、の初期値をi
システムのRAMに近いバイト数で変更することをお勧めします。