1

CおよびC++では、nullポインターの逆参照は未定義の動作です。Objective-Cはどうですか?

言い換えれば、このコードは何をすることが保証されていますか?

*(long*)0 = 0;

背景:この回答が未定義の動作を引き起こし、ステートメントが最適化されるなどのランダムなものや、さらに奇妙なものを引き起こす可能性があるのではないかと思います。

もちろん、私はこれを行うことを推奨しません。それでも、言語のルールを知ることは重要です。

4

4 に答える 4

7

Objective-CはCの上にあるオブジェクト指向のレイヤーにすぎないため、純粋なCステートメントには特別な追加の意味はありません。これによると、この場合、*(long*)0 = 0;はCと同じように評価および解釈されるため( Cであるため)、未定義の動作を呼び出します。そのため、何もすることが保証されていません。

于 2012-11-30T19:19:31.733 に答える
2

ヌルポインタの間接参照は、Objective-Cでは未定義のままです。

唯一の注意点は、メッセージングは​​間接参照を必要としないということです。nullポインター(またはObjective-C用語)へのメッセージングnilは​​常に明示的に安全であり、さらにnullポインターを返すように定義されています。

したがって、のような複合メッセージング[[class alloc] init]は​​常に明示的に安全です。

于 2012-11-30T19:20:57.180 に答える
1

ステートメントが実行することが保証されているのは、未定義の動作を呼び出すことだけです。

特定のコンパイラを使用して、特定のプラットフォームで特定の処理を実行することが保証される場合があります。

于 2012-11-30T19:18:52.960 に答える
0

その答えに見られるstrcpy(0、 "bla")は常にクラッシュしていて、それがどのように機能しないのか、またはコンパイラーによって最適化されているのかわかりません。

于 2012-11-30T20:48:42.623 に答える