cの問題を解いていて、コンパイルはできたのですが、ランタイムエラーとなってしまい困っています。
自分で調べてみて何となく文字列のところがまずいと思うのですが直し方がわかりません。
どなたか助けていただけると嬉しいです。
コード内の間違ってそうなところに★をつけます
問題
自作の落ちものゲームを開発することにしました。 ゲームの仕様は次のようになっています。
・ゲームは縦幅 H、横幅 W の長方形のフィールドで行われます。
・ゲームが始まると、様々なサイズの長方形がフィールドの上方から一つずつ順番に落ちてきます。
・落ちてくる長方形の直下に他の長方形もしくはフィールドの底辺がある場合、接触したとみなして長方形の位置は固定されます。
手始めに、上記の仕様に従って落ちてくる長方形の動きをシミュレーションしましょう。
N 個の長方形が落ちてきた後のフィールドの状態を表示するプログラムを書いてください。
入力される値
H W N
h_1 w_1 x_1
h_2 w_2 x_2
...
h_N w_N x_N
・1 行目には 3 つの整数 H, W, N がこの順に半角スペース区切りで与えられます。
H はフィールドの縦幅を、W はフィールドの横幅を、 N は落ちてくる長方形の個数を表します。
・続く N 行のうち i 行目 (1 ≦ i ≦ N) には i 番目に落ちてくる長方形のサイズと落ちてくる位置の情報が入力されます。
ここではこの長方形の縦幅 h_i、横幅 w_i、長方形の左端とフィールドの左端の距離 x_i がこの順に半角スペース区切りで与えられます (問題文中の図を参照)。
・入力は合計で N + 1 行であり、入力最終行の最後に改行が 1 つ入ります。
エラー
Runtime error(Exit status:139(Invalid memory reference))
#include <stdio.h>
int main(void) {
//数値の読み取り
int tate,yoko,kosuu,buro[40][3],q=0,s;
char mozi[40][40];
scanf("%d",&tate);
scanf("%d",&yoko);
scanf("%d",&kosuu);
for(int i=0;i<kosuu;i++){
for(int j=0;j<3;j++){
scanf("%d",&buro[i][j]);
}
}
//全部ブロックがない状態にする
for(int i=0;i<tate;i++){
mozi[i][yoko]='\0';//★★★★
for(int j=0;j<yoko;j++){
mozi[i][j]='.';//★★★★
}}
//ブロックを置く場所を調べる
for(int i=0;i<kosuu;i++){
q=0;
for(int j=tate-1;j>=0;j--){
for(int k=buro[i][2];k<buro[i][2]+buro[i][1];k++){
if(mozi[j][k]=='#'){
q=1;
s=j;
break;
}
}
if(q==1)break;
}
//ブロックを置いていく
for(int m=(s+q);m<(buro[i][0]+s+q);m++){
for(int n=buro[i][2];n<(buro[i][1]+buro[i][2]);n++){
mozi[m][n]='#';//★★★★
}
}
}
//解答の出力
for(int i=tate-1;i>=0;i--){
for(int j=0;j<yoko;j++){
printf("%c",mozi[i][j]);
}
printf("\n");
}
return 0;
}