ということで、プログラムを実行させた際に良く分からないメッセージがでたら、鎌田に報告しましょう。
int main(int argc, char** argv) { int * tmp = NULL; printf("*tmp = %d", *tmp); return 0; }つまり、アドレス 0 の値を見てみようとした訳です。こういうことをすると、OS はアクセスを拒絶します。 こんな感じです。ポインタの初期化を忘れた時などに良く起ります。
kamada@shusaku%a.out Segmentation fault (core dumped)
int main(int argc, char** argv) { char buf[] = "abcdefg"; /* abcdefg という文字列作成 */ int * tmp = (int*)buf; /* buf の先頭を int へのポインタと見立てる */ printf("1st: tmp = %x\n", tmp); printf("1st: *tmp = %d\n", *tmp); tmp = (int*)(buf + 1); /* buf + 1の先頭を int へのポインタと見立てる */ printf("2nd: tmp = %x\n", tmp); printf("2nd: *tmp = %d\n", *tmp); /* BUS ERROR が起るはず */ return 0; }で、4byte データの int は、4の倍数の場所にしかいちゃいけないんですが、2nd *tmp は4 の倍数 + 1 の場所にいます。 ってわけで、そんなアドレスから int を読み込もうとすると、無理無理といって怒られます。
kamada@shusaku%a.out 1st: tmp = 7fff2ef8 1st: *tmp = 1633837924 2nd: tmp = 7fff2ef9 Bus error (core dumped)まあ、普通はこんなことわざわざしないんですが、pointer の初期化を行っておらずゴミの値が入っていたりすると、 意図せず起きたりします。
2002.10.21/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp