7

私のアルゴリズムでは、動的配列ではなく静的配列で動作することを知っています。しかし、私は時々スタックの限界に達します。私は正しいですか、その静的配列はスタックに格納されていますか?

1つのCプログラムの最大スタックサイズに影響するパラメータはどれですか?

最大アレイサイズに影響を与える多くのシステムパラメータはありますか?最大数はありませんか。要素の数は配列タイプに依存しますか?システムRAM全体に依存しますか?または、すべてのCプログラムに静的な最大スタックサイズがありますか?

4

3 に答える 3

9

私は正しいですか、その静的配列はスタックに格納されていますか?

いいえ、staticアレイは静的ストレージ領域に格納されます。自動のもの(つまり、関数内で宣言され、staticストレージ指定子がないもの)はスタックに割り当てられます。

1つのCプログラムの最大スタックサイズに影響を与えるパラメーターはどれですか?

これはシステムに依存します。一部のオペレーティングシステムでは、プログラムでスタックサイズを変更できます

自動ストレージ割り当てが原因でスタックスペースが不足していることは、メモリ戦略を再検討する必要があることを明確に示しています。再入可能性が問題にならない場合は、静的ストレージ領域にバッファを割り当てるか、最大のメモリ割り当てに動的割り当てを使用する必要があります。あなたのアレイの。

于 2013-02-07T14:12:51.370 に答える
2

実際には、使用するプラットフォームのCコンパイラによって異なります。

例として、実際のスタックを持たないシステムもあるため、再帰は機能しません。

静的配列は、ポインタを含む連続メモリ領域としてコンパイルされます。ポインタのサイズは2バイトまたは4バイト(またはエキゾチックなプラットフォームでは1バイトのみ)の場合があります。

サイズ(そしてもちろん速度)が異なる「近い」ポインタと「遠い」ポインタを持つメモリページを使用するプラットフォームがあります。したがって、配列とオブジェクトを表すポインタが同じメモリページに収まる必要がある場合があります。

組み込みシステムでは、静的データは通常、メモリ領域に収集され、後で読み取り専用メモリによって表されます。したがって、アレイはそこに収まる必要があります。

任意のアプリケーションを実行するプラットフォームでは、上記のいずれにも当てはまらない場合、RAMが制限要因になります。

于 2013-02-07T14:14:01.047 に答える
1

あなたの質問のほとんどは答えられました、しかしただ私の人生をずっと楽にしてくれた答えを与えるために:

定性的に、動的に割り当てられていないアレイの最大サイズは、使用している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に近いバイト数で変更することをお勧めします。

于 2014-08-09T00:04:03.763 に答える