私はポインターを使っていくつかのテストを行ってきましたが、次の2つのシナリオに出くわしました。誰かが私に何が起こっているのか説明できますか?
void t ();
void wrong_t ();
void t () {
int i;
for (i=0;i<1;i++) {
int *p;
int a = 54;
p = &a;
printf("%d\n", *p);
}
}
void wrong_t() {
int i;
for (i=0;i<1;i++) {
int *p;
*p = 54;
printf("%d\n", *p);
}
}
mainの次の2つのバージョンを検討してください。
int main () {
t();
wrong_t();
}
プリント:54 \ n54 \ n、予想通り
int main () {
wrong_t();
}
歩留まり:セグメンテーション違反:11
この問題は、「wrong_t()」の「int * p」が正しく初期化されていないため「不正なポインタ」であるという事実から生じていると思います(参照:cslibrary.stanford.edu/102/PointersAndMemory.pdf、8ページ) )。しかし、なぜこのような問題が発生するのかがわかりません(たとえば、wrong_t()の前にt()を呼び出した場合、またはwrong_t()のコードのforループを削除した場合は発生しません)。