アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語でWindowsのプログラムを作成しようとしています。(初心者)
Windows のプログラムでは、グローバル変数は最大どれくらい確保できるものなのでしょうか?
また、グローバル変数を多く取りすぎると、OSへ影響が出るのでしょうか?

下記の変数を確保使用としています。
char Data[1000][4096];

よろしくお願いいたします。

A 回答 (14件中11~14件)

>『char Data[1000][4096];』を使用しインデックスで、読出し,書込みを高速に行おうとしています。

このような使い方の場合、mallocを使用すると、検索に時間がかかってしまいそうな気がしますが、いい方法はないでしょうか?
-------------------
この問題については、本来配列の添字による走査は便利ですが、ポインタによる配列の走査が速いと思います。
自分は下記のような配列の走査がよく使います:
/* put a NULL as a member of array , For judging pointer */
char *str[] = { "aaa". "bbb", NULL};
char **pointer = NULL;

pointer = str;

while(*pointer){/* 最後のNULLになったら終了 */
dosomething();/* 処理 */
pointer++;
}
なお、添字みたいなメンバーへアクセスするとき、pointer+nでアクセス可能だと思います。

もちろん、ポインタ使わず、配列だけ使っても結構です。

この回答への補足

早速の回答ありがとうございました。
私の補足質問に言葉か足らなかったようです。申し訳ありませんでした。
データが固定である場合、『char *str[] = { "aaa", "bbb", NULL};』も可能かと私も考えましたが、格納すべき入力データは、インデックスごとにどランダムに入力され、このデータを『char Data[1000][4096];』に格納しようとしています。また、扱うデータはバイナリデータです。
検索に多少時間がかかっても、mallocを使用した何らかのデータ構造を使用したほうがいいとゆうことででしょうか?

補足日時:2006/02/17 15:05
    • good
    • 0

>『確実に保証される』とはどのようなことなのでしょうか?32767バイト以降は、処理中に破壊されてしまうのでしょうか?



標準Cの規格では、(正常に)コンパイル・実行できなければならない最低限の要件が「翻訳限界」として規定されています。その中に、1個のオブジェクトのバイト数として32767バイトが挙げられています。

ただし、これは最低限の要件なので、こうした制約がない方が望ましいともされています。しかし、32767バイトを超えるオブジェクトを宣言した場合、コンパイルできなかったり、実行時に誤動作しても致し方ありません。具体的にどんな振る舞いになるかはわかりません。
    • good
    • 0

> Windows のプログラムでは、グローバル変数は最大どれくらい確保できるものなのでしょうか?



Windowsというよりは、コンパイラに依存します。

コンパイラに関係なく(といっても非標準処理系は除く)確実に保証されるのは、一つのオブジェクトあたり32767バイトまでです。

この回答への補足

回答ありがとうございました。
>コンパイラに関係なく(といっても非標準処理系は除く)確実に保証されるのは、
とありますが、『確実に保証される』とはどのようなことなのでしょうか?32767バイト以降は、処理中に破壊されてしまうのでしょうか?

補足日時:2006/02/17 11:50
    • good
    • 0

こんにちは


まず、グローバル変数はなるべく使用しないほうがいいです。使用しざるを得ないときのみ使ってください。
多く使うとき、メモリの占用は多くなるし、プログラム終了までずっと独占されるわけです。
それから
char Data[1000][4096];
という定義のやり方はあまり薦めしません。
それは非常に大きい値であり、普通のやり方はポインタを使用し、最初適当にメモリを確保し(malloc)、あとは足りないとき動的に確保メモリサイズを変更する(realloc)のです。
mallocなどでメモリを確保し使い終わったらfree関数で解放することも忘れないように。

最大どのぐらい確保できるかという質問されると・・その方向であまり考えないようにしましょう。最小どのぐらいメモリの確保が必要なのかを自分に質問しましょう^^

この回答への補足

回答ありがとうございました。もう少し質問させてください。
『char Data[1000][4096];』を使用しインデックスで、読出し,書込みを高速に行おうとしています。このような使い方の場合、mallocを使用すると、検索に時間がかかってしまいそうな気がしますが、いい方法はないでしょうか?

補足日時:2006/02/17 11:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!