- ベストアンサー
間接参照演算子(*)による値設定で、「セグメンテーション違反です」となる件について
以下のコードは、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; }
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
int* ip = 0; これはipというint型のポインタに0を代入している。 アドレス0(0番地)へのアクセスを *ip = 0; でしているのでセグメント違反。 ※ヌルポインタとほぼ同じ ip = &i をするとポインタにiのアドレスが代入されるのでOK。 どうしたいのかが解りません。それによりアドバイスが異なります。
お礼
>#1さま すみません。分かりました。 1)値が0x00000000のポインタはオブジェクトを指せないという事 2)自分がアホだという事 どうもありがとうございました。
補足
>#1さま 現在、LippmanのC++Primer(第4版)を勉強してまして、練習問題7.5(p.267)(intとintへのポインタをパラメタとする関数の作成)をやっていたらセグメンテーション違反が出てしまい、ポインタの初期化について調べていたら、この現象に当たりました。 Lippmanでは、p.136で、 「ポインタを初期化しないのは良くない(初期化していないポインタは実行時エラーのよくある種である)」 として、ポインタを使う時には、 int* pi = 0; と初期化することを薦めているのですが、 こうした初期化は好ましくないのでしょうか?