NULL ポインターが であることはわかっています。(void*)0
しかし、次のようなステートメントを使用するとどうなりますか。
if(ptr==NULL)
NULLptr
はchar
、たとえば C では、によって返される型が左辺値の型に暗黙的に変換されるのと同じように、左側の型に暗黙的に変換されることが保証されていますfloat
かint
?malloc()
void*
NULL ポインターが であることはわかっています。(void*)0
しかし、次のようなステートメントを使用するとどうなりますか。
if(ptr==NULL)
NULLptr
はchar
、たとえば C では、によって返される型が左辺値の型に暗黙的に変換されるのと同じように、左側の型に暗黙的に変換されることが保証されていますfloat
かint
?malloc()
void*
NULL は左側の型に暗黙的に変換されることが保証されていますか? [...]
はい。
ISO/IEC 9899:2011 C プログラミング言語標準のセクション 6.3.2.3.4 によると、次のようになります。
null ポインターを別のポインター型に変換すると、その型の null ポインターが生成されます。任意の 2 つのヌル ポインターは、比較すると等しくなります。
セクション 6.3.2.3.1 へ
void へのポインターは、任意のオブジェクト型へのポインターとの間で変換できます。任意のオブジェクト型へのポインターは、void へのポインターに変換され、再び元に戻される可能性があります。結果は元のポインタと等しくなります。
NULL ポインターが
(void*)0
必ずしも。0
マクロ NULL は、 、(void*)0
または他の何かとして定義できます。唯一の要件は、特定の実装のヌル ポインターと互換性があることです。理論的には、コンパイラは NULL を 1 として定義できますが、実際には誰もそれを行いません。
左側の型に暗黙的に変換されることが保証されている NULL です
はい、null ポインターが別の種類のポインターと一緒に使用される式は、null ポインターを生成します。これは、NULL を (void*) として定義する一部の実装とは関係ありません。C 標準では、NULL マクロに関係なく、NULL ポインターの変換が保証されています。
C では、malloc() によって返される型は void* ですが、暗黙的に左辺値の型に変換されますか?
はい、C では avoid*
は常に別の型のポインターとの間で暗黙的に変換されます (ただし、C++ では明示的なキャストが必要です)。