2017-09-01 13 views
1

Cにおいて、charの配列のインデックスが0から2^(sizeof(size_t) * CHAR_BITS)の範囲とすることができるが、アレイのメンバーの数は、その数に1を加え、缶」であります変数size_tによって保持されます。例えば最大配列のインデックスと、プラットフォーム上での長さが

は、のx86で、sizeof(size_t)4であれば、配列が一杯になった場合、インデックスは、0xFFFFFFFF0から行くが、メンバーのカウントができ、0xFFFFFFFF + 1です。 sizeof(size_t)で保持することはできません。

1)これは正しいですか?
2)最高のインデックスを0xFFFFFFFEに制限することを検討していますが、より良い解決策はありますか?

私はこの例が極端であることを知っていますが、参考として使用したいと思います。

+1

これは、 'size_t'もバイト単位の最大サイズであるため、' char'配列にのみ当てはまります。 sizeof(T)> 1の場合、最大インデックスは '2^sizeof(size_t)/ sizeof(T)'になり、それに1を加えても安全です。 – Barmar

+1

理論的な配列サイズ制限を超える前に、仮想メモリが使い果たそうとします。 – tkausl

+0

なぜか@tkauslですか? '0xFFFFFFFF'はちょうど4ギガバイトですが、仮想メモリはそれ以上の物理的なメモリより大きくはありませんか? –

答えて

1

オブジェクト

最大サイズは約SIZE_MAXあります。 sizeof objectは、オブジェクトのサイズを返します。返されるタイプは、タイプsize_tです。 size_tの範囲は[0...SIZE_MAX]です。

サイズ制限は、オブジェクトを計算可能にしなければならないアドレスの1分の1以下です。

アレイオブジェクトあるので、最大4バイトint配列

int big_int_array[SIZE_MAX/sizeof(int)]; // Perhaps 1 less 

配分

malloc()

を介して割り当てられることが最大のメモリであろう約SIZE_MAXです。

char *big_array = malloc(SIZE_MAX - 1); 

calloc()を介して割り当てられることが最大メモリは約SIZE_MAX * SIZE_MAXバイトで、まだこのような大きな割り当ての試みは、通常NULLを返します。

double *big_array = calloc(SIZE_MAX/2, sizeof *big_array); 

これは、Linuxではなく、これが可能です。ほとんどのプラットフォームは、製品がSIZE_MAXを満たしている/超えている場合はNULLを返します。

ここで、big_array[]は、[0...SIZE_MAX/2)となります。これは、通常、多くのプラットフォームが採用している従来のユニバーサル線形モデルではなく、アドレス方式を必要とします。

1

C標準では、オブジェクトのサイズはsizeofで返され、そのタイプはsize_tであり、戻り値はバイト単位であるため、あらゆる種類の通常のオブジェクトに対して絶対最大値バイト単位のサイズはSIZE_MAXになります。 SIZE_MAXより大きいオブジェクトをmalloc,reallocと割り当てることはできません。 callocのAPIがそれを可能にする可能性があります。

したがって、配列は最大でSIZE_MAX個の要素を持ちます。

1つのオブジェクトはSIZE_MAXを超えることはできませんが、プログラム内のすべてのオブジェクトの合計バイト数はSIZE_MAXを超えることがあります。 オブジェクト

関連する問題