ページ 11

大きすぎる配列の割り当て

Posted: 2010年11月21日(日) 06:38
by shiro4ao
CLAS構造体の配列の中のSTUDENT構造体にアクセスしたかったのですが
CLAS配列の要素を大きくするとクラッシュしてしまいました。
なにか原因があるのでしょうか?
ちなみにCLAS配列の要素は20×20ほど準備しておきたかったです。

コンパイラはBorland C++ Compiler
処理系は Windows Vista SP2

=========================コード=======================================
#include <stdio.h>
#include <string.h>
#include <windows.h>



typedef struct{
int count;
char a[512];
char b[512];
char c[512];
char d[512];
char e[10];
int f[6];
char g[1024];
int h;
int i;
int j;
}STUDENT;


typedef struct{
STUDENT st[40];
int count;
}CLAS;

int main()
{
//csv読み書き用の配列
STUDENT table[300];

//格納先
CLAS matrix[20][20];          


matrix[1][1].st[1].count=1;
printf("%d",matrix[1][1].st[1].count);
return 0;
}
==============================================================================

Re:大きすぎる配列の割り当て

Posted: 2010年11月21日(日) 08:31
by ゆーずぃ
仮想メモリ領域を含めて5.93Gあります?まぁ、Vistaだから+1Gは必要かな。実効メモリの管理についてはそんなに詳しくないけど、それが原因では…?

Re:大きすぎる配列の割り当て

Posted: 2010年11月21日(日) 08:43
by shiro4ao
たしかに、ありえないほどメモリを使っています。
無駄に使わないように変更してみようと思います。
ありがとうございました。

Re:大きすぎる配列の割り当て

Posted: 2010年11月21日(日) 19:53
by めるぽん
printf("%d bytes\n", sizeof(STUDENT) * 300);
// 937200 bytes

printf("%d bytes\n", sizeof(CLAS) * 20 * 20);
// 49985600 bytes

となりました。
48.5MB 程度なので、メモリが足りないわけではないと思います。
ただし普通の環境では余裕でスタックに収まらないサイズなので、それが原因でクラッシュしているのではないでしょうか。
malloc や new で確保してあげれば直るかもしれません。

Re:大きすぎる配列の割り当て

Posted: 2010年11月21日(日) 20:54
by ゆーずぃ
失礼、寝ぼけてKbyteを基本単位にしてました…m(__)m

Re:大きすぎる配列の割り当て

Posted: 2010年11月22日(月) 00:04
by shiro4ao
>ぬるぽんさん
スタックサイズが問題だったようですね。

かねてより疑問だった
buf[4000*10000]とするとクラッシュするが
mallocすると大丈夫という疑問が解けました。
ありがとうございます。

>ゆーずぃさん
徹夜明けだったせいか自分も気づきませんでした・・・・
ありがとうございます。