この質問をする方にいうのもちょっと、という感もありますが、言っちゃいます。
便宜上「ポインタの指す先が"無い"」「どこも指していないポインタ」などといいます。プログラムのソースコードレベルの概念としてはそういうこともあるのですが、コンピュータ上で実際にプログラムが動くときには(値を持っていないint型変数、などというのがないのと同様に)ポインタは変数としてなんらかの値を持っています。ポインタが持っている値ですからそれはアドレスで、ポインタ経由のアクセスを指示されればC言語のプログラムは実際の動作として、そのアドレスにアクセスをします。値が0だろうとなんだろうと。
ここまでがC言語の動き(プログラムが「強制終了になる」なんて話は一切出ていないことに注意してください)。
で、ここからOSだとかハードウェアの話になります。
最近のOSはメモリ管理をしていて、メモリの領域毎にアクセスを見張っています。アプリケーションはOSに「申請」をして、もらった領域だけについて「読み出す」あるいは「読み書きできる」のですが、それ以外の領域をいじろうとすると、OSから規約違反ということでお叱りを受けます。そのお叱りが例えば「アクセス例外」とか「強制終了」。
あるいは、例えば奇数番地からの複数バイトアクセスは許されない、なんていうCPUもあって、そういうCPUでは奇数番地からのアクセスがあるとハードウェアとして割り込みが発生してプログラムの動作が中断したりもします。
これが無効なアドレスにアクセスすると強制終了する...の流れです。
決して「C言語が」強制終了させているわけではないことに注意。というのは、今回は初期化した値が確実に0だったのでOSが確実に検知できてキレイに強制終了になりましたが、そうでない場合もあるから。
C言語では「ローカル変数は意図的に初期化しない限り初期値不定(プログラムを実行してみるまで値が何になるか決まらない)」ということになっています。そういう条件下で生成したヘンな値を持ったポインタ、あるいは単に計算を間違えてヘンな値が入っていても同じことですが、これがたまたまOSから使用許可をもらっているアドレス値になっていて、そこにアクセスして他のソースコード上ではなんの関わりもない他の変数等を書き換えてしまうことはあり得るわけです。
そうなると、
・C言語そのものにはヘンなアドレスへのアクセスを止める仕組みはない
・OSも、許可を与えたアドレス範囲内のアクセスのミスは検知できない
ので、場合によっては「強制終了するわけでもないが、滅茶苦茶な動作を始める」などという結果になって影響が現れたりします。
(世の中には、OSのない環境で動くプロクラム、あるいはメモリ管理機能のないOSなんてのもあるので、そういう場合はもはや「命綱なし」であるとも言えるのですが)
C言語は「プログラムの動作は全てプログラマの責任」ということで、不当なアクセスの検証を放棄しています(かっこよく「プログラマの邪魔をしない」とか言ってはいますが、C言語ができた1970年代のコンピュータの能力にそこまで面倒を見る余裕はなかった、ということでもあるのでしょう)。
なので、「変なポインタ値になっちゃっても強制停止になるからわかるんだ」などと思ってしまわないようにしてください。一見ちゃんと動いているプログラムの奥底でじわじわと他のデータを破壊していて、ある日突然バグが発覚する...なんていうのはC言語ではよくあることです。