• ベストアンサー

間接参照演算子(*)による値設定で、「セグメンテーション違反です」となる件について

 以下のコードは、GNU C++でコンパイル出来るのですが、実行時に 「セグメンテーション違反です」 と怒られてしまいます。  何ででしょうか? ============== #include <iostream> using namespace std; int main() { int i = 1; int* ip = 0; // ip = &i; // ←この行のコメントを外すと直ります *ip = 0; cout << "i: " << ip << endl; return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.1

int* ip = 0; これはipというint型のポインタに0を代入している。 アドレス0(0番地)へのアクセスを *ip = 0; でしているのでセグメント違反。 ※ヌルポインタとほぼ同じ ip = &i をするとポインタにiのアドレスが代入されるのでOK。 どうしたいのかが解りません。それによりアドバイスが異なります。

mha01
質問者

お礼

>#1さま すみません。分かりました。 1)値が0x00000000のポインタはオブジェクトを指せないという事 2)自分がアホだという事 どうもありがとうございました。

mha01
質問者

補足

>#1さま 現在、LippmanのC++Primer(第4版)を勉強してまして、練習問題7.5(p.267)(intとintへのポインタをパラメタとする関数の作成)をやっていたらセグメンテーション違反が出てしまい、ポインタの初期化について調べていたら、この現象に当たりました。 Lippmanでは、p.136で、 「ポインタを初期化しないのは良くない(初期化していないポインタは実行時エラーのよくある種である)」 として、ポインタを使う時には、 int* pi = 0; と初期化することを薦めているのですが、 こうした初期化は好ましくないのでしょうか?

関連するQ&A