この質問では、初期化子を使用してポインターをnullに設定します。の値を使用する代わりに、の0
値0L
が使用されます。0
正確なnullポインター表現は実装固有であるため、nullポインターには正確に使用する必要があることを読みました。
0L
ポインタをnullに設定するために使用すると、移植中に問題が発生する可能性がありますか?
この質問では、初期化子を使用してポインターをnullに設定します。の値を使用する代わりに、の0
値0L
が使用されます。0
正確なnullポインター表現は実装固有であるため、nullポインターには正確に使用する必要があることを読みました。
0L
ポインタをnullに設定するために使用すると、移植中に問題が発生する可能性がありますか?
標準 (4.10.1) から:
NULL ポインター定数は、ゼロに評価される整数型の整数定数式 (5.19) の右辺値です。
0L
だから大丈夫だと思います。
0L
割り当て先のポインター型が long と同じサイズであると信じていることを意味するという事実を除いて、問題はないと思います。そのため、少し混乱します。
NULL
を使用すると、はるかに明確になると思います。
nullptr
C++0x には、タイプと呼ばれる新しい null ポインター定数がありnullptr_t
ます。任意のポインター型に暗黙的に変換できます。
それまでは NULL を使用することをお勧めしますが、0 と 0L はどちらも、これまで聞いたことのあるすべての実装で機能します。
私はあなたに正確な答えを与えることはできませんが、あなたの質問に対する正確な答えが何であるかに関係なく、ポインタを で初期化するという考え自体0L
が間違っていますlong
.もちろん、必然的に真実です。
コンパイラがそれを受け入れるかどうか、またそれが安全かどうかに関係なく、無効なアイデアを示唆しているため、私はそれを行いません。
ヌル ポインターの表現は実装固有ですが、0 も 0L も必ずしもその実装ではありません。ユーザーがヌル ポインターを指定できる方法であり、どちらでもかまいません。
Bjarne Stroustrup は、プレーンな 0 (NULL ではなく) を使用することを好むと何度か述べていることを指摘しておく必要があります。
NULL の使用を推奨する人には同意しませんが、3 つのオプションのいずれも実際に機能します。慣用的な C++ では、標準の選択は 0 です (おそらく、それが Stroustrup の好みであるためです: http://www2.research.att.com/~bs/bs_faq2.html#null )。
0L は、0 と同じ方法で暗黙的に適切なポインター型にキャストされます。それは少し奇妙に見えるだけで、Jesperが与えた理由についてはあまり意味がありません..
false
、0
、0l
、0L
、0ul
、0u
、00
または任意の数の方法を使用して、リテラル ゼロを表すことができます。リテラルのゼロは、基本的に魔法の記号であり、たまたま null ポインター定数にも対応しています。
たまたまビット単位のゼロである値について話し、コードがポインターに対して memcpy-ing を行っていた場合、上記の問題が発生します。
おまけの質問: ビット単位のゼロではない null ポインター定数を持つ型はどれですか?
NULLと言ったすべての人に同意する必要があります。0 の使用を好む人には、コードでその意味を示す必要があるというのが私の意見です。必要な結果は null ポインターであるため、コードでそれを示す必要があります。比較すると、さらに理にかなっています。
if (some_variable == NULL) { ... }
よりもはるかに明確です
if (some_variable == 0) { ... }
長整数 (64 ビット) である 0L を 32 ビット ポインターに割り当てると、問題が発生する可能性があります。言及された他の投稿のように、NULL を使用してポインターをゼロに初期化します。