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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# 配列の変数宣言について。
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
複数の選択範囲の行番号を個別...
-
【C言語】配列の中に配列を入れ...
-
VBで構造体の配列を関数に渡す...
-
先頭アドレスとは何ですか?
-
VBで動的なメモリの確保
-
配列の参照渡しで型が一致しま...
-
C++ vectorに配列をプッシュしたい
-
LGノートPCグラムについて
-
c言語の __FILE__ について
-
パスカルの三角形
-
9枚の写真がA4 1枚に印刷できま...
-
Redimした動的配列はEraseする...
-
2次元配列を戻り値とする関数?
-
【速いブラインドタッチ】手を...
-
4勤2休のシフト作成
-
vectorで文字列の配列を使う方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
配列の参照渡しで型が一致しま...
-
ExcelVBAで質問です。離れた二...
-
unsigned char配列への入力の仕方
-
VBで構造体の配列を関数に渡す...
-
C++ vectorに配列をプッシュしたい
-
C言語で特定列だけを抽出して配...
-
Excel、VBAのユーザーフォーム...
-
複数の選択範囲の行番号を個別...
-
配列をEraseしてもメモリが開放...
-
配列を含む構造体の初期値について
-
【速いブラインドタッチ】手を...
-
C言語 配列の再初期化
-
Redimした動的配列はEraseする...
おすすめ情報