ページ 11

二次元配列の初期化について

Posted: 2014年3月28日(金) 04:29
by あでぃ
二次元配列を利用して、800*600のMAPの当たり判定を作ろうと思い、数が多くなってしまったためfor文を利用して配列の初期化をしようとしたのですが、思った通りの結果を得られませんでした。
二次元配列を利用して、0から数字を一つずつ増やして文字を表示して思った通りに配列の数字を変更出来るか試してみたのですが、下記のプログラムでは600*400までの配列の初期化は出来るのですが、

コード:

#include "stdio.h"

int main(void){
	int ix,iy;
	int map[600][400];

	for(iy=0;iy<=599;iy++){
		for(ix=0;ix<=399;ix++){
			map[iy][ix]=ix+(iy*400);
			printf("%5d ",map[iy][ix]);
			if(ix>=399){
			printf("\n");
			}
		}
		
	}
	return 0;
}
下記のように600*500に変更をしてコンパイルをすると実行後強制終了してしまいます。

コード:

#include "stdio.h"

int main(void){
	int ix,iy;
	int map[600][500];

	for(iy=0;iy<=599;iy++){
		for(ix=0;ix<=499;ix++){
			map[iy][ix]=ix+(iy*500);
			printf("%5d ",map[iy][ix]);
			if(ix>=499){
			printf("\n");
			}
		}
		
	}
	return 0;
}
自分自身、C言語について学校で簡単なプログラムの作成をした程度で、このエラーの原因がわからずじまいです…
単純に自分のプログラムが間違えているのか、環境によって変わってくるのかもわからず、初めてこの掲示板で質問をさせていただきました。
もしよろしければ、ご指摘お願いいたします。

Re: 二次元配列の初期化について

Posted: 2014年3月28日(金) 05:21
by へにっくす
そんなあなたはこれを参照すると幸せになれるかもしれない。
C言語-メモリスタック

要するにスタックメモリのサイズ1MBを超えてるんですね。
通常int型は4バイトとりますから、
600*400*4=960000バイト=937.5KB。約0.9155MB。
600*500*4=1200000バイト=1171.875KB。約1.1444MB。
(1MB=1024KB=1048576バイト)

Re: 二次元配列の初期化について

Posted: 2014年3月28日(金) 09:28
by softya(ソフト屋)
とりあえずローカル変数で大きな配列は作れない・作らない程度の認識で良いと思います。
static変数、グローバル変数にするか、mallocで動的確保するかを検討してください。

Re: 二次元配列の初期化について

Posted: 2014年3月28日(金) 11:07
by みけCAT
Linuxならulimitコマンドで、Windowsのgccならコンパイルオプションで、
それぞれスタック領域の大きさを増やすことができます。
必要なら、ググるか補足を待ってください。

Re: 二次元配列の初期化について

Posted: 2014年3月28日(金) 16:55
by あでぃ
へにっくすさん、softyaさん、みけCATさん、返信ありがとうございました。
参考URLを見させていただき、今回のエラーの原因とメモリ確保について調べてみました。
ひとまず、今回は変数をstatic変数に変更して無事動作させることが出来ました。ありがとうございました!