13

標準では、null ポインターを逆参照すると、未定義の動作が発生することが示されています。しかし、「ヌルポインタ」とは何ですか? 次のコードでは、「ヌル ポインター」と呼んでいます。

struct X
{
  static X* get() { return reinterpret_cast<X*>(1); }
  void f() { }
};

int main()
{
  X* x = 0;
  (*x).f(); // the null pointer?  (1)

  x = X::get();
  (*x).f(); // the null pointer?  (2)

  x = reinterpret_cast<X*>( X::get() - X::get() );
  (*x).f(); // the null pointer?  (3)

  (*(X*)0).f(); // I think that this the only null pointer here (4)
}

私の考えでは、null ポインターの逆参照は最後のケースでのみ行われます。私は正しいですか?C++ 標準によると、コンパイル時の null ポインターと実行時の違いはありますか?

4

4 に答える 4

12

最初と最後だけが null ポインターです。reinterpret_cast他のものは、実装定義のポインター値の結果であり、したがって操作されます。それらの動作が定義されていないかどうかは、キャスト先のアドレスにオブジェクトがあるかどうかによって異なります。

于 2010-03-24T22:36:10.620 に答える
12

0 に評価される整数定数式はヌル ポインターとして有効であるため、最初のケースもヌル ポインターを逆参照しています。

算術計算によって 0 に設定されたポインターは、必ずしも null ポインターではありません。ほとんどの実装では、null ポインターと同じように動作しますが、これは標準では保証されていません。

于 2010-03-24T22:36:17.093 に答える
7

C++ 標準 (2003) 4.10

4.10 ポインタ変換

1 NULL ポインター定数は、0 に評価される整数型の整数定数式 (5.19) 右辺値です。null ポインター定数はポインター型に変換できます。結果はその型の null ポインター値であり、オブジェクトへのポインターまたは関数型へのポインターの他のすべての値と区別できます。同じ型の 2 つのヌル ポインター値は、比較すると等しくなります。null ポインター定数から cv 修飾型へのポインターへの変換は単一の変換であり、ポインター変換の後に修飾変換 (4.4) が続くシーケンスではありません。

5.2.10 キャストの再解釈

注 64) 整数定数式 (5.19) を値 0 で変換すると常に null ポインター (4.10) が生成されますが、たまたま値 0 を持つ他の式を変換しても null ポインターが生成される必要はありません。

1) X* x = 0; (*x).f();はい。0 は整数定数式で、NULL ポインター定数に変換されます。次に、ヌルポインター定数をヌルポインター値に変換できます。

2)x = X::get();いいえ、5.2.10 の注 64 を参照してください。

3)x = reinterpret_cast<X*>( X::get() - X::get() );いいえ、5.2.10 の注 64 を参照してください。

4) ( (X )0).f(); はい。0 (整数定数式) --> NULL ポインター定数 --> NULL ポインター値。

于 2010-03-25T08:53:51.693 に答える
0
X* x = 0;
(*x).f(); // the null pointer?  (1)

f()実際にはthisポインターを使用することはなく、 には仮想メソッドがありませんが、これは逆参照として認められると思いますX。私の反射神経は、これはクラッシュだと言うことでしたが、今考えると、よくわかりません。

x = X::get();
(*x).f(); // the null pointer?  (2)

おそらく無効なポインターです。クラッシュするかどうかはわかりません (理由については上記を参照してください)。

x = reinterpret_cast<X*>( X::get() - X::get() );
(*x).f(); // the null pointer?  (3)

式はX::get() - X::get()コンパイルされますか? そのような別のポインターからポインターを減算することは合法だとは思いませんでした。

編集:ああ!もちろん合法です。私が考えていたことは何でしょう?明らかに、私はあずき色です。

于 2010-03-24T22:38:39.807 に答える