8
#include <iostream>

int main()
{
    int* i = 0;
    int x = (*i);
    std::cout << x;
}

上記のプログラムは、を使用してコンパイルして実行するとVisual Studio 2010クラッシュします。ポインタを 0 に設定したため、クラッシュすることがわかっています。

私が知りたいのはnull pointer、標準で定義されている C++ にアクセスすることですか、それとも未定義ですか。コンパイラ/コンピューター/オペレーティング システムが原因でプログラムがクラッシュしたことは幸運なことです。

定義されている場合、null ポインターにアクセスしようとすると、C++ は何を保証しますか?

4

3 に答える 3

9

null ポインターを逆参照すると、未定義の動作が呼び出されます。複数回コンパイルすると、同じコンパイラで異なることが発生する可能性があります。動作の保証は一切ありません。

于 2013-06-12T08:49:05.630 に答える
3

ここでプロセスがクラッシュするのは、OS がプログラムがアクセスできないメモリ (アドレス 0) をいじるのを止めているためです。Windows では「アクセス違反」が発生し、Linux/Unix では「セグメンテーション違反」が発生します。

また、C と C++ で NULL ポインターの定義が異なるのはなぜですか? も参照してください。標準でヌルポインタが何であるかの引用

于 2013-06-12T08:56:22.170 に答える
2

C++ では定義されていないため、一部のオペレーティング システムではクラッシュしない可能性がありますが、現在の (および以前の) バージョンの Windows と Linux ではクラッシュする可能性があります。どちらも (ユーザー プロセスとして) そのメモリにアクセスできないためです。位置。

また、Windows では、プログラムを中断させたい場合は、DebugBreak(); を試してください。これにより例外が発生します (MSDN によると: 現在のプロセスでブレークポイント例外が発生します。これにより、呼び出し元のスレッドがデバッガーに例外を処理するように通知できます。)

于 2013-06-12T08:59:34.080 に答える