• ベストアンサー

mallocの確保要素数の限界は?

C言語では、確か確保できる要素数が65536個までとか聞いたことがあります。ためしに、 #include <stdio.h> #define NUM 100000 int main(void){ unsigned char x[NUM]; x[NUM-1] = 200; printf("%d", x[NUM-1]); } のようなプログラムを作って、gccでコンパイルしたところ、問題なく動きました。しかし、処理系によっては動かないこともありえると思うのですが、私の理解は正しいでしょうか?もちろん、PCに装備しているメモリ容量以下、という前提です。 つまり、配列の要素数を65536個を超えて確保し、要素も65537以上の要素で指定したいのです。2次元でx[2][65536]とかやると、65537個の配列とかが作れないので、2次元確保はしたくないのです。mallocなら処理系に関係なく65536要素を超える配列の設定が可能なのでしょうか? この辺の知識があいまいなので、はっきり知っている方がいたら教えてもらえると助かります。 よろしくお願いします。 main文内で

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

処理系によっては、32768バイト以上のオブジェクトを作ることができません。これは翻訳限界として、保証されているオブジェクトのサイズによります。 また、size_t型が16ビットの場合、65535バイトまでのオブジェクトしか作ることができません。callocを使えばそれ以上の配列を割り付けられる可能性は形式的にはありますが、実際にそれだけのメモリがあるかどうかは別問題です。 そもそも、8ビットCPUの環境などでは、アドレス空間自体が64kバイトしかないのが普通ですから、そのような環境で65537バイト以上の配列を割り付けることは不可能です。 よって、処理系に依存せずに65537バイト以上の配列を作る方法は存在しません。

g47040
質問者

お礼

なるほど、やはりそうでしたか。 portabilityを向上させるには、エラーチェックコードを入れた方がよいということですね。 ありがとうございました。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>C言語では、確か確保できる要素数が65536個までとか聞いたことがあります。 誤報でありましょう。 仮に、staticでない領域に配列を定義する場合、65536を超える要素数でもOKです。いくつが上限であるかは環境によると思います。 staticな領域に配列を定義する場合、staticでない領域の場合よりも大きな要素数でもOKです。一般に。 mallocなどで動的に確保する場合は、それこそメモリの許す限りOKです。 >配列の要素数を65536個を超えて確保し、 この意味はわかります。しかし、 >要素も65537以上の要素で指定したいのです。 この意味はわかりません。

g47040
質問者

お礼

>要素も65537以上の要素で指定したいのです。 というのは、例えば、 unsigned char x[65537]; x[65537-1] = 1; とかをやりたい、 ということでした。 みなさんのおかげでもやもやがすっきりしました。ありがとうございます。

回答No.1

googleなどで「C言語 配列 添字 上限」で検索を掛けるといくらでも結果が出そうですが。。。 また、関数内でそんな大きな領域を取得するとスタック領域に置かれるため、階層的に呼び出せる関数の数が少なくなります。 かなり大きな領域を確保するのであれば、malloc等でヒープ領域に取得し、使い終わったらfreeする方が良いと思われます。

g47040
質問者

お礼

なるほど、localで巨大な配列を取るときはmallocでとった方がいいということですね。 ありがとうございました。