C言語関係掲示板

過去ログ

No808 配列の最大個数の制限

[戻る] [ホームページ]
No.10208

配列
投稿者---uno(2003/10/30 23:50:45)


初心者な質問ですみません。
配列の最大個数って制限ありますか?
教えてください。お願いします。

No.10209

Re:配列
投稿者---RAPT(2003/10/30 23:55:15)


静的配列なら、スタックサイズに依存します。
動的配列なら、ヒープサイズに依存します。
さらに、その型のサイズによっても変動します。

No.10216

Re:配列
投稿者---たか(2003/10/31 11:16:48)


>静的配列なら、スタックサイズに依存します。

静的配列もBSS、すなわちヒープサイズの一部に依存する事がほとんど
ですよ。つまり静的配列が多ければ多いほど、実際に使用できるヒープ
サイズは減少します。

No.10217

Re:配列
投稿者---たか(2003/10/31 14:50:29)


>>静的配列なら、スタックサイズに依存します。

あ、わかった!静的配列でなくて、ローカル変数の配列とお書きになりた
かったんですね。

静的配列というと static 属性の配列を意味しますので意味が違ってきま
す。

No.10218

Re:配列
投稿者---たいちう(2003/10/31 16:16:01)


きっと質問者は「配列の最大個数は1000までです」というような回答を
期待していたんだと思います。その期待に沿った回答をしてみようかな。
間違っていた場合は訂正お願いします。

例えば私の使っているVC6のヘルプによると、ヒープもスタックも
デフォルトの設定では1MBだそうです。
単純計算すると、4バイトのint型なら25万個使えることになります。
ヒープ領域もスタックも、配列の変数のためだけに使うわけではないので、
実際に25万個使えるわけではないですが。

実際に↓で試すと、

#include <stdio.h>
#include <conio.h>

#define NUM 258514

int main()
{
    int data[NUM], i, sum = 0;
    for (i=0;i<NUM;i++)
        data[i] = 1;
    for (i=0;i<NUM;i++)
        sum += data[i];
    printf("NUM = %d\nsum = %d\n", NUM, sum);

    // quit
    printf("End.\n");
    getch();
    return 0;
}

258514が限界でした。あれ?258514>25万 と思ったら、
1MB / 4B = 1024 * 1024 / 4 = 262144 > 258514でした。
まあ、妥当な数字か。

環境依存であることをお忘れなく。コンパイラやコンパイル
オプション、他の変数や構造体の数と型、関数の呼び出しの
深さなどの影響を受けます。