配列について
Posted: 2008年9月12日(金) 01:33
こんばんは、早速ですが質問させて頂きたい事があります。
現在課題としてコマンドプロンプト上で動くリバーシを作っているのですが、その作業の最中に配列と構造体で引っかかってしまいました。
質問内容なのですが、
まず仮にこのようなプログラムがあるとします。
このプログラムを実行した結果が以下になります(目がチカチカしそうな内容ですいません...)
この結果を見て、まず疑問に思ったのが配列の要素数が[8][8]にも関わらず、[8][16]まで表示できているという点です。
今までの勝手な認識では、配列というのは宣言した要素数までしか使用出来ず、仮にその要素数を超えるような要素に値が代入・あるいは表示される場合はエラーか警告を返してくれるのだと思っていました。
しかしこの結果を見る限りそうでもないようですので、仕様(?)ということでしょうか……?
それと、
black[3][4].flag=1;
black[4][3].flag=1;
white[3][3].flag=1;
white[4][4].flag=1;
という具合に1を代入しているのですが、結果を見ると変な所にまで1が代入されてしまっています。
憶測ですがアドレスか何かの関係かな? と適当に思ってはみているのですが、よければ解説をお願いしたいです。
最後にもう一つだけ。。。
まず、以下のような構造体と配列があるとします。
配列の場合、初期化されていないので各要素にとんでもない値が代入されているようですが、
構造体の配列(?)であるblackは最初から全て0で初期化されているということを知りました。
ですが、仮に0で初期化したい場合、やはり初期状態で勝手に0が代入されていると言っても
やはり初期化の処理はしておいた方がいいのでしょうか?
こちらのサイトのゲームプログラミングの館などでは初期化を行っているので、
恐らくした方がいいとは思うのですが、一応確認をということで……。
また、構造体の配列の場合0で初期化されているのは仕様というかそんな感じなのでしょうか?
分かりにくい質問かもしれませんが、何かアドバイス頂ければ幸いです。
コンパイラ:BorlandC++ Compiler
開発環境:CPad for Borland C++Compiler
OS:Windows XP
現在課題としてコマンドプロンプト上で動くリバーシを作っているのですが、その作業の最中に配列と構造体で引っかかってしまいました。
質問内容なのですが、
#include <stdio.h>
typedef struct{
int flag;
}STONE;
STONE black[8][8];
STONE white[8][8];
int main(void){
black[3][4].flag=1;
black[4][3].flag=1;
white[3][3].flag=1;
white[4][4].flag=1;
for(int s=0; s<8; s++){
for(int j=0; j<16; j++){
printf(" %d",black[j].flag);
}
printf("\n");
}
printf("\n");
for(int s=0; s<8; s++){
for(int j=0; j<16; j++){
printf(" %d",white[j].flag);
}
printf("\n");
}
return (0);
}
まず仮にこのようなプログラムがあるとします。
このプログラムを実行した結果が以下になります(目がチカチカしそうな内容ですいません...)
・結果
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
この結果を見て、まず疑問に思ったのが配列の要素数が[8][8]にも関わらず、[8][16]まで表示できているという点です。
今までの勝手な認識では、配列というのは宣言した要素数までしか使用出来ず、仮にその要素数を超えるような要素に値が代入・あるいは表示される場合はエラーか警告を返してくれるのだと思っていました。
しかしこの結果を見る限りそうでもないようですので、仕様(?)ということでしょうか……?
それと、
black[3][4].flag=1;
black[4][3].flag=1;
white[3][3].flag=1;
white[4][4].flag=1;
という具合に1を代入しているのですが、結果を見ると変な所にまで1が代入されてしまっています。
憶測ですがアドレスか何かの関係かな? と適当に思ってはみているのですが、よければ解説をお願いしたいです。
最後にもう一つだけ。。。
まず、以下のような構造体と配列があるとします。
1.構造体
typedef struct{
int flag;
}STONE;
STONE black[8][8];
2.配列
int black2[8][8];
配列の場合、初期化されていないので各要素にとんでもない値が代入されているようですが、
構造体の配列(?)であるblackは最初から全て0で初期化されているということを知りました。
ですが、仮に0で初期化したい場合、やはり初期状態で勝手に0が代入されていると言っても
やはり初期化の処理はしておいた方がいいのでしょうか?
こちらのサイトのゲームプログラミングの館などでは初期化を行っているので、
恐らくした方がいいとは思うのですが、一応確認をということで……。
また、構造体の配列の場合0で初期化されているのは仕様というかそんな感じなのでしょうか?
分かりにくい質問かもしれませんが、何かアドバイス頂ければ幸いです。
コンパイラ:BorlandC++ Compiler
開発環境:CPad for Borland C++Compiler
OS:Windows XP