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も見ています
-
都道府県穴埋めゲーム
都道府県の名前を1人1つずつ投稿してください。全ての都道府県が出たら締め切ります!
-
配列の添え字の最大数とは?
C言語・C++・C#
-
C言語の2次元配列 容量が大きすぎる場合の対処方法
C言語・C++・C#
-
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
-
4
配列の要素数に変数を入れたいときには
C言語・C++・C#
-
5
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
6
関数から配列を返すには?
C言語・C++・C#
-
7
char型配列の最大要素数
C言語・C++・C#
-
8
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
9
C言語初心者の質問失礼します。
C言語・C++・C#
-
10
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
11
fopne で失敗する原因
C言語・C++・C#
-
12
C言語でファイル読み書きを早くしたい。
C言語・C++・C#
-
13
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
14
大容量の静的な確保の限界値
C言語・C++・C#
-
15
画面を強制的に再描画させる方法
C言語・C++・C#
-
16
C言語のポインターに関する警告
C言語・C++・C#
-
17
char str[256]の256の意味は?
C言語・C++・C#
-
18
複数桁10進数の*桁目だけを抽出したい
C言語・C++・C#
-
19
mallocの確保要素数の限界は?
C言語・C++・C#
-
20
C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列をEraseしてもメモリが開放...
-
配列で格納したものをmsgboxで...
-
Redimした動的配列はEraseする...
-
配列を使わずに、変数名を動的...
-
C# Listを使わずに2次元配列の...
-
【C言語】配列の中に配列を入れ...
-
4勤2休のシフト作成
-
LGノートPCグラムについて
-
VBでC言語のポインタみたい...
-
unsigned char配列への入力の仕方
-
C# 配列の変数宣言について。
-
Functionの戻り値を2次元配列...
-
capslockの解除の仕方を教えて...
-
VB.NET 構造体の配列の検索機能...
-
C言語で特定列だけを抽出して配...
-
if文の判定条件に配列
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
配列同士の文字列の比較
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
C# 配列の変数宣言について。
-
先頭アドレスとは何ですか?
-
C言語で特定列だけを抽出して配...
-
配列の参照渡しで型が一致しま...
-
VBで構造体の配列を関数に渡す...
-
C++ vectorに配列をプッシュしたい
-
【速いブラインドタッチ】手を...
-
unsigned char配列への入力の仕方
-
配列をEraseしてもメモリが開放...
-
【C言語】配列の中に配列を入れ...
-
ExcelVBAで質問です。離れた二...
-
4勤2休のシフト作成
-
Functionの戻り値を2次元配列...
-
Redimした動的配列はEraseする...
-
配列を含む構造体の初期値について
-
複数の選択範囲の行番号を個別...
おすすめ情報