ptr
がnull ポインターで(uintptr_t)ptr
ある場合、 が であるという保証は標準にはありません0
。
null ポインターとゼロ整数が同等でないシステムを気にしない場合は、問題ありませんinfo.init = 0;
。
メンバーは整数型です。init
「null にする」ことはできません。それに割り当てる0
か、null ポインターを に変換した結果を割り当てることができますuintptr_t
。これまでのほぼすべての C 実装で、これらは同じことです。しかし、それは保証されておらず、同じではないシステムがありました.
NULL
NULL ポインターの場合もあれば、整数定数の場合もあります0
。後者の場合は、標準で保証されてい(uintptr_t)(NULL)
ます0
。info.init = NULL; (void*)(info.init);
そのため、未定義の動作を持つ実装が存在する可能性があります。null に相当する整数が 0 でなく、無効なポインター値の計算が UB である場合、null ポインターにはなりません。
info
したがって、ポインタ型に変換されたときにヌルポインタになることを保証したい場合は、真の移植性のために行う必要がありますinfo.init = (uintptr_t)(void*)(NULL);
。uintptr_t
オプションで、 の代わりに が変換されるポインターの型を含めることで、読者に追加の手がかりを与えることができますvoid*
。を保存する正当な理由はほとんどないuintptr_t
ため、何が起こっているのかを読者の助けになるかもしれないというヒントを示します。
標準では、ポインター型に変換された値がゼロの定数式は null ポインターであることが保証されていることに注意してください。これは、ポインター型に変換されたゼロ値の非定数式が null ポインターであることを意味するものではありません。また、整数型に変換されたヌル ポインターが 0 であることも意味しません。これらの最後の 2 つのことは、ほとんどの実装 (すべての「最新の」実装を含む) で当てはまります。