
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文内で
No.3ベストアンサー
- 回答日時:
処理系によっては、32768バイト以上のオブジェクトを作ることができません。
これは翻訳限界として、保証されているオブジェクトのサイズによります。また、size_t型が16ビットの場合、65535バイトまでのオブジェクトしか作ることができません。callocを使えばそれ以上の配列を割り付けられる可能性は形式的にはありますが、実際にそれだけのメモリがあるかどうかは別問題です。
そもそも、8ビットCPUの環境などでは、アドレス空間自体が64kバイトしかないのが普通ですから、そのような環境で65537バイト以上の配列を割り付けることは不可能です。
よって、処理系に依存せずに65537バイト以上の配列を作る方法は存在しません。
なるほど、やはりそうでしたか。
portabilityを向上させるには、エラーチェックコードを入れた方がよいということですね。
ありがとうございました。
No.2
- 回答日時:
>C言語では、確か確保できる要素数が65536個までとか聞いたことがあります。
誤報でありましょう。
仮に、staticでない領域に配列を定義する場合、65536を超える要素数でもOKです。いくつが上限であるかは環境によると思います。
staticな領域に配列を定義する場合、staticでない領域の場合よりも大きな要素数でもOKです。一般に。
mallocなどで動的に確保する場合は、それこそメモリの許す限りOKです。
>配列の要素数を65536個を超えて確保し、
この意味はわかります。しかし、
>要素も65537以上の要素で指定したいのです。
この意味はわかりません。
>要素も65537以上の要素で指定したいのです。
というのは、例えば、
unsigned char x[65537];
x[65537-1] = 1;
とかをやりたい、
ということでした。
みなさんのおかげでもやもやがすっきりしました。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
BCBで配列の要素数(0)の場合
-
Redimした動的配列はEraseする...
-
【速いブラインドタッチ】手を...
-
DXライブラリでの2Dの描画...
-
配列を使わずに、変数名を動的...
-
Excel、VBAのユーザーフォーム...
-
構造体配列を引数とするDLL作成...
-
ファイルの読み込みとメモリ確...
-
VBで動的なメモリの確保
-
C言語で特定列だけを抽出して配...
-
配列を含む構造体の初期値について
-
C++、コンストラクタの引数の数...
-
unsigned char の配列で途中で0...
-
配列と他の変数のメモリ領域重...
-
C言語プログラミングで数あてゲ...
-
C# Listを使わずに2次元配列の...
-
「#undef」と「#define」の使い...
-
char*を初期化したいのですが
-
関数から配列を返すには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
C# Listを使わずに2次元配列の...
-
配列を使わずに、変数名を動的...
-
複数の選択範囲の行番号を個別...
-
配列で格納したものをmsgboxで...
-
【速いブラインドタッチ】手を...
-
C言語で特定列だけを抽出して配...
-
配列をEraseしてもメモリが開放...
-
配列を含む構造体の初期値について
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
メモリの初期値
-
C++ vectorに配列をプッシュしたい
-
Redimした動的配列はEraseする...
-
VBで構造体の配列を関数に渡す...
-
【C言語】配列の中に配列を入れ...
-
ExcelVBAで質問です。離れた二...
-
Functionの戻り値を2次元配列...
-
ガウスの消去法のプログラム
おすすめ情報