私はこのコードをテストしていますが、その結果<< op
、最初に に到達するとプログラムがクラッシュしますcout
(出力されop =
てから停止するため)。
char *lo = 0, *op = 0, *ro = 0;
cout << "op = " << op << endl;
cout << "*op = " << *op << endl;
今私の質問は:なぜこれが起こるのですか?
私は知っています、ポインターは私に多くの問題を引き起こします..
あなたのタイトルで行くと、「ポインタが初期化されている場合もクラッシュを生成します」。
作成したポインターは、どのメモリ位置にも初期化されていません。それへのポインタを初期化するということは、それを NULL に初期化して0
いることを意味します。
ポインターは、メモリアドレスを保持することになっています (使用する前に*
) または NULL (逆参照する前に、メモリロケーションを割り当てるまでランダムなメモリロケーションを変更して問題が発生しないようにします。また、ポインタがは現在活動していません)。
char *lo = 0, *op = 0, *ro = 0;
あなたのポインターは現在NULLであり、メモリの場所を指していません。
char a = 'A';
char * lo = &a; / char* lo = new char[10]; etc
初期化されていないポインタまたは NULL ポインタの逆参照は未定義の動作です。
あなたのプログラムはすでに
cout << "op = " << op << endl;
<<
これは、 for 演算子のオーバーロードがあり、char*
それらを 0 で終わる文字配列の最初の要素へのポインターとして解釈し、次の 0 バイト出力の前に文字を出力するためです。したがって、ポインターを逆参照する必要があります。しかしop
、null ポインターとして初期化したため、逆参照すると未定義の動作が呼び出され、多くの場合、クラッシュ (セグメンテーション フォールト) が発生します。
op
異なるポインタ型へのキャスト。void*
cout << "op = " << static_cast<void*>(op) << endl;
その行を機能させ、ヌルポインターの実装定義の表現を出力します。
を明示的に逆参照する次の行では、まだ未定義の動作 (およびおそらくクラッシュ) が発生しますop
。