
No.7
- 回答日時:
規格上、1個のオブジェクトのバイト数として保証されるのは...
C90の場合、32767バイトまで
C99の場合、65535バイトまで
です。
バイト数ですので、配列の要素がint型であれば、(C90なら)32767/sizeof(int)バイトまでです。
No.6
- 回答日時:
(私の経験では)添え字の中は符号付のint型で解釈されるのでアクセスできるのはint型の正の最大値まで。
※添え字で参照できないだけで、ポインタ使ったり多次元配列とのUNIONにしたり工夫すれば使用は可能
他の方の回答にあるように、確保出来る配列サイズの最大は別問題
No.5
- 回答日時:
あなたの環境が全く分からないので具体的な上限は書けませんが, 規格上ホステッド環境 (端的には「OS の上で動いている状態」) では「65536 バイト以上のオブジェクトは使えなくても文句は言えない」となっています. つまり, sizeof Array ≧ 65536 となるときには動かないかもしれません.
おまけですが「そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。」というのは正確じゃないですね>#2.
仮想メモリ空間そのものはちゃんと 4GB とられています. ただしカーネルが使うメモリ分として 2GB (オプションを付ければ 1GB) 持っていかれるので, 「ユーザプログラムが自由に使える領域」として 2GB (または 3GB) の制限があります... という説明も本当は正確じゃない (1プロセスでそれを超えるメモリを使う技術は存在する) んだが, 面倒なので以下省略.
とはいえ, こんなことができるかどうかを考える前に, どうしてそんなにメモリが必要なのかを検討するべきだというこれまでの回答者の意見には全面的に賛成.
No.4
- 回答日時:
>C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
言語仕様上では、上限はありません。
コンパイラは「実行時に実際にメモリが確保出来るかどうかは考えず、言われた通りに、言われた通りの領域を確保するようなプログラムコードを生成するだけ」です。
リンクして実行ファイルを作ろうとした時にサイズオーバーしてエラーになろうが、実行時にスタックやデータ領域が足りずに例外を発生して異常終了しようが、コンパイラは「お構いなし」です。
ただ黙々と「言われた通りにコード生成」して「後の事は知ったこっちゃない」のが「コンパイラ」です。
そして「後の事は知ったこっちゃない状態」で作られたプログラムは、実行したとたん「メモリが破綻して異常終了」するでしょう。
>もし可能なのであれば上限を2147483647にしたいのですが
それは「要素数が2147483647個の配列を作りたい」って事ですか?
だとしたら「その配列が確保出来る実行環境」を用意し、そこで実行すれば良いだけです。
例えば「64ビットCPUを搭載し、64ビットのアドレス空間すべてにメモリを実装してあって、64ビットのアドレス空間を自在に使用可能なOSを走らせ、そのOSで動く実行ファイルを生成するコンパイラ」を使えば、要素数が2147483647個の配列を何個でも使えます。
なぜなら、その動作環境では「メモリが18446744073709551616バイトもある」のですから「要素数が2147483647個の配列なんか、ゴミみたいなもん」です。
このように「実行環境で、メモリが無尽蔵にある」かも知れないので「コンパイラは、言語仕様上では、配列の要素数に上限を設けていない」のです。
下手に、仕様に「上限」を定めてしまうと「実行環境では充分なメモリがあるのに、言語の仕様に縛られて、大きな配列を確保出来なくなってしまう」という弊害が出ます。なので「仕様では、上限無し」になっています。
もちろん、それは「仕様の上だけ」であって「実行時、実際に、そんだけのメモリが確保出来るかは、まったく別の問題」です。

No.3
- 回答日時:
私が今ままで、プログラミングをしてきた経験では、
そのような、非常に大きい添え字を必要とする状況は発生しませんでした。
通常、そこまでの添え字を必要としないと思いますが、
どうしてそのようなことをなさりたいのでしょうか?
そのこと自体に、非常に興味があります。
よろしければ、その理由もしくは背景を教えていただけませんでしょうか?
この回答への補足
物理系のシミュレーションをしています。
試行ごとにある現象が起こるかどうかをrand()%RAND_MAXがその現象が起こる確率pに比べて大きいか小さいかで判断しています。
この方法では毎回rand()を参照しなければならずボトルネックになっていました。そこで、あらかじめArray[0]~Array[RAND_MAX-1]まで乱数を読み込んでおいて順番に使おうかなと考えました。
そのためにArray[RAND_MAX] (RAND_MAX=2147483647)の配列を準備したかったというのが背景です。
しかし、先ほど自分でもいろいろと調べていたらxorshift()という関数が非常に高速でかつ乱数としても優れているそうなのでそちらを使ってみることにしました。xorshift()に関しては分からないことがありますが、それは別の質問とします。
No.1
- 回答日時:
言語上の上限はsize_tの上限と一致するとは思いますが、そんなメモリをスタックに保有できるような環境は存在しません。
Windows上では一般的にスタックは1Mとかですから、実質的にはその半分の500kも確保できれば良いほうじゃないんでしょうか?
C言語で長大な配列を確保したい場合は、動的配列にするのが常套手段ですが、それでも2Gなんて連続領域を確保することはほぼ不可能だと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
C言語の2次元配列 容量が大きすぎる場合の対処方法
C言語・C++・C#
-
配列の添え字の最大数とは?
C言語・C++・C#
-
関数から配列を返すには?
C言語・C++・C#
-
-
4
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
5
char型配列の最大要素数
C言語・C++・C#
-
6
C言語で巨大配列を作るにはどうすれば良いのでしょうか?
C言語・C++・C#
-
7
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
8
C言語 exitの使い方
C言語・C++・C#
-
9
C言語での引数の省略方法
C言語・C++・C#
-
10
char str[256]の256の意味は?
C言語・C++・C#
-
11
C言語のポインターに関する警告
C言語・C++・C#
-
12
mallocの確保要素数の限界は?
C言語・C++・C#
-
13
配列の要素数に変数を入れたいときには
C言語・C++・C#
-
14
バッファとは何ですか
C言語・C++・C#
-
15
プログラムについての質問です。 fflush(stdout)はいったいどのような時に使われているので
C言語・C++・C#
-
16
fopenで別ディレクトリにファイルをオープンしたい
C言語・C++・C#
-
17
配列の要素数を超えた参照のコンパイル
C言語・C++・C#
-
18
C言語 エラーの原因がわからないので,見てほしいです
C言語・C++・C#
-
19
C++のfor文について
C言語・C++・C#
-
20
ピクチャーボックスの大きさに合わせて画像を表示
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# Listを使わずに2次元配列の...
-
C言語 配列の長さの上限
-
【速いブラインドタッチ】手を...
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
C言語でのカンマ区切りについて
-
ExcelVBAで質問です。離れた二...
-
配列の参照渡しで型が一致しま...
-
C# 配列の変数宣言について。
-
VBで構造体の配列を関数に渡す...
-
構造体から平均点を求める方法
-
9枚の写真がA4 1枚に印刷できま...
-
ポインタの配列のコンマについて
-
テキストファイルから文字列を...
-
C言語でcharの足し算
-
CSVファイルのデータを2次元配...
-
VB2008: 構造体の配列の初期化...
-
配列を含む構造体の初期値について
-
複数の選択範囲の行番号を個別...
-
4勤2休のシフト作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
C# Listを使わずに2次元配列の...
-
配列を使わずに、変数名を動的...
-
複数の選択範囲の行番号を個別...
-
配列で格納したものをmsgboxで...
-
【速いブラインドタッチ】手を...
-
C言語で特定列だけを抽出して配...
-
配列をEraseしてもメモリが開放...
-
配列を含む構造体の初期値について
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
メモリの初期値
-
C++ vectorに配列をプッシュしたい
-
Redimした動的配列はEraseする...
-
VBで構造体の配列を関数に渡す...
-
【C言語】配列の中に配列を入れ...
-
ExcelVBAで質問です。離れた二...
-
Functionの戻り値を2次元配列...
-
ガウスの消去法のプログラム
おすすめ情報