1. ホーム
  2. c

[解決済み] C言語における配列の最大サイズは?

2022-02-16 13:40:02

質問内容

プログラム実行時に確保されるメモリ量は、ハードウェアによって制限されることは理解しています。しかし、私の疑問は ハードウェアに関係なく 仮にメモリ量に制限がないとして、配列に制限はないのでしょうか?

解決方法は?

はありません。 固定 C言語では、配列のサイズに制限があります。

配列オブジェクトも含め、単一のオブジェクトのサイズは SIZE_MAX 型の最大値は size_t の結果である。 sizeof 演算子を使用します。 (よりも大きなオブジェクトをC標準が許可しているかどうかは完全には不明です)。 SIZE_MAX バイトですが、実際にはそのようなオブジェクトはサポートされていません; 脚注を参照)。 このため SIZE_MAX は実装によって決定され、いかなるプログラムによっても変更することはできないので、この場合 SIZE_MAX バイトのオブジェクトを作成します。(これは上限であって、最小上限ではありません。実装によっては、より小さな制限を課すこともできますし、通常そうします)。

タイプの幅 void* 汎用のポインタ型であるため、実行中のプログラムにおける全オブジェクトの合計サイズに上限があります(単一オブジェクトの最大サイズよりも大きくなる可能性があります)。

C言語規格では、これらの固定サイズに下限を設けているが、上限は設けていない。 適合するC実装は無限サイズのオブジェクトをサポートすることはできませんが、原理的には任意の有限サイズのオブジェクトをサポートすることができます。 上限は、個々のC言語実装や動作環境、物理学によって課されるものであり、言語によって課されるものではありません。

例えば、準拠した実装では SIZE_MAX は 2 に等しい 1024 -1、つまり 原則的に までのオブジェクトがあります。179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137215 バイトになります。

このようなオブジェクトを実際にサポートするハードウェアが見つかると良いですね。

フットノート : よりも大きいオブジェクトは存在できないという明確なルールはない。 SIZE_MAX バイトになります。 を有用に適用することはできなかったのですね。 sizeof 演算子は、他の演算子と同様に、このようなオブジェクトに適用されます。 sizeof はオーバーフローする可能性があります。だからといって、そのようなオブジェクトに対して操作を実行できないわけではありません。 しかし実際には、まともな実装であれば size_t サポートするオブジェクトの大きさを表すのに十分な大きさです。