0

私はこのコードをテストしていますが、その結果<< op、最初に に到達するとプログラムがクラッシュしますcout(出力されop =てから停止するため)。

char *lo = 0, *op = 0, *ro = 0;
cout << "op = " << op << endl;
cout << "*op = " << *op << endl;

今私の質問は:なぜこれが起こるのですか?

私は知っています、ポインターは私に多くの問題を引き起こします..

4

5 に答える 5

1

あなたのタイトルで行くと、「ポインタが初期化されている場合もクラッシュを生成します」。

作成したポインターは、どのメモリ位置にも初期化されていません。それへのポインタを初期化するということは、それを NULL に初期化して0いることを意味します。

ポインターは、メモリアドレスを保持することになっています (使用する前に*) または NULL (逆参照する前に、メモリロケーションを割り当てるまでランダムなメモリロケーションを変更して問題が発生しないようにします。また、ポインタがは現在活動していません)。

char *lo = 0, *op = 0, *ro = 0;

あなたのポインターは現在NULLであり、メモリの場所を指していません。

char a = 'A';
char * lo = &a; / char* lo = new char[10]; etc

初期化されていないポインタまたは NULL ポインタの逆参照は未定義の動作です。

于 2013-05-23T12:42:20.677 に答える
1

あなたのプログラムはすでに

cout << "op = " << op << endl;

<<これは、 for 演算子のオーバーロードがあり、char*それらを 0 で終わる文字配列の最初の要素へのポインターとして解釈し、次の 0 バイト出力の前に文字を出力するためです。したがって、ポインターを逆参照する必要があります。しかしop、null ポインターとして初期化したため、逆参照すると未定義の動作が呼び出され、多くの場合、クラッシュ (セグメンテーション フォールト) が発生します。

op異なるポインタ型へのキャスト。void*

cout << "op = " << static_cast<void*>(op) << endl;

その行を機能させ、ヌルポインターの実装定義の表現を出力します。

を明示的に逆参照する次の行では、まだ未定義の動作 (およびおそらくクラッシュ) が発生しますop

于 2013-05-23T12:47:51.743 に答える