C言語関係掲示板

過去ログ

No.493.callocで確保できる配列の限界について

[戻る] [ホームページ]
No.3635

callocで確保できる配列の限界について
投稿者---たこやき(2002/11/28 20:53:25)


C言語初心者です。

calloc関数でN×M個の2次元配列(double型)を確保し、中身を0に初期化しているのですが、
N×Mが約7500を超えると、EXEファイルを実行したときに途中で止まってしまいます。

どうしても、最低101×101個のdouble型2次元配列を確保したいのですが、何か良い方法はないでしょうか?
またRAMが1ギガのPCでも同じ結果になったのですが、RAMの大きさは関係ないのでしょうか?

callocは以下のように使用しています(一部抜粋)。


#define N 101
#define M 101

array = (double**)calloc(N,sizeof(double*));
for(i = 0 ; i < N ; i++)
array[i] = (double*)calloc(M,sizeof(double));




free(array);

どうぞよろしくお願い致します。



No.3637

Re:callocで確保できる配列の限界について
投稿者---kikk(2002/11/28 23:38:14)


ども。


>calloc関数でN×M個の2次元配列(double型)を確保し、中身を0に初期化しているのですが、

なぜ、calloc()が問題になっていると判断したのかが、提示されたコード
からは読み取れないので、以下は推測を含んだ書き込みになりますが。。


>N×Mが約7500を超えると、EXEファイルを実行したときに途中で止まってしまいます。

doubleのサイズが8バイトだとすると、確保されるサイズは7500*8で60000
ですね。実は使っているコンパイラが16ビットコンパイラで、特になんにも
指定しないとポインタが16ビットになる、というような場合は、64kしか
アドレッシングできないので、要素数7500あたりから問題が起こる可能性が
あります。処理系次第ですね。


>またRAMが1ギガのPCでも同じ結果になったのですが、RAMの大きさは関係ないのでしょうか?

見えたり使えたりするメモリ空間は必ずしも物理的なRAMの量に直結するとは
限りません。これも処理系次第ということになります。


> for(i = 0 ; i < N ; i++)
> array[i] = (double*)calloc(M,sizeof(double));

C言語では実数の内部表現は規定していませんので、これで各要素がゼロに
なる保証はありません。まあ、内部表現がIEEE形式であれば、期待通りに
なるかもしれませんが。


あと、問題とは関係ありません(はずです)が、

> array = (double**)calloc(N,sizeof(double*));

は、直後に値を設定しているようなので、malloc()でいいのでは?


参考:
http://www.catnet.ne.jp/kouno/c_faq/c7.html
(の7.16と7.31)


最低限、OSと使っているコンパイラを書いておくと、きっと解決が
早くなります。問題が環境に左右される可能性がある場合は特に。
「EXEファイルを実行」という文からOSがDOS/Win系であることは
想像できますが、あくまで想像ですし。


では。

No.3642

Re:callocで確保できる配列の限界について
投稿者---たか(2002/11/29 11:26:20)


同じく環境が書いてないので確定的な事は書けませんが、おそらく
DOS版のコンパイラのスモールモデルを使っているためではないかと
思われます。

LSI-C86試食版などがこれにあたります。それ以外ならば、コンパクト
モデルまたはラージモデルまたはヒュージモデルを使えば動く可能性
があります。

LSI-C86試食版ならば、farcalloc()を使えます。

No.3645

Re:ありがとうございます。
投稿者---たこやき(2002/11/29 12:29:03)


>LSI-C86試食版などがこれにあたります。それ以外ならば、コンパクト
>モデルまたはラージモデルまたはヒュージモデルを使えば動く可能性
>があります。
>
>LSI-C86試食版ならば、farcalloc()を使えます。

OSはWindowsMeで、LSI-C86を使っていました。
皆さんのおかげで解決できそうです。
どうも有難うございました。


No.3646

Re:ありがとうございます。
投稿者---たか(2002/11/29 13:46:06)


ちなみに、LSI-C86試食版でfar領域にアクセスするには、farキーワード
を付ける必要があります。これは、スモールモデルである事から来る
制限です。

簡単なテストプログラムを走らせて見ましたが大丈夫なようです。

#include <stdio.h>
#include <dos.h>

#define N 101
#define M 101

int main(void)
{
  int i, j;
  double far* far* array;
	
  array = (double far* far*)farcalloc(N, sizeof(double far*));
  for (i = 0; i < N; i++)
    array[i] = (double far*)farcalloc(M, sizeof(double));
  
  for (i = 0; i < N; i++)
    for (j = 0; j < M; j++)
      array[i][j] = i * N + j;
  
  for (i = 0; i < N; i++)
    for (j = 0; j < M; j++)
      if (array[i][j] != i * N + j)
        printf("エラーを発見しました。\n");
		
  for (i = 0; i < N; i++)
    farfree(array[i]);
  farfree(array);
	
  return 0;
}