5

私は構造を持っています

struct detail {
int id;
uintptr_t init;
// blah blah
};
struct detail info;
info.id = 1;
info.init = (uintptr_t)NULL;

initメンバーをNULLにする必要があります。型キャストする (または型キャストしない) 場合、何が起こるか、または起こらない可能性がありNULLますか? NULL のように直接割り当てるとどうなりますinfo.init = NULL;か 実行時エラーに関して違いはありますか。それはうまくコンパイルされます。しかし、コードの実行は私の主な関心事です。

ありがとう

4

3 に答える 3

7

ptrがnull ポインターで(uintptr_t)ptrある場合、 が であるという保証は標準にはありません0

null ポインターとゼロ整数が同等でないシステムを気にしない場合は、問題ありませんinfo.init = 0;

メンバーは整数型です。init「null にする」ことはできません。それに割り当てる0か、null ポインターを に変換した結果を割り当てることができますuintptr_t。これまでのほぼすべての C 実装で、これらは同じことです。しかし、それは保証されておらず、同じではないシステムがありました.

NULLNULL ポインターの場合もあれば、整数定数の場合もあります0。後者の場合、標準で保証されてい(uintptr_t)(NULL)ます0info.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 つのことは、ほとんどの実装 (すべての「最新の」実装を含む) で当てはまります。

于 2013-03-15T10:21:13.770 に答える
2

NULL は、システム上のヌル ポインターに一致する値を持つ組み込み定数です。システム上のポインターと同じサイズ (またはそれより大きい) の int に定数値を代入することは完全に有効です。

于 2013-03-15T10:08:11.870 に答える
0

整数へのポインターの代入は通常許可されておらず、警告が生成されるため、ここではキャストに投票します。intptr_tもちろん、十分な大きさなので、使用するのは非常に良い考えです。

于 2013-03-15T10:21:16.097 に答える