Null: The never-ending story

Posted by Michał ‘mina86’ Nazarewicz on 27th of March 2011

I have already mentioned some problems with the null pointer but my recent discovery knocked my socks off.

By now, it should come with no surprise to anyone that 0 in pointer context acts as a null pointer (no matter of its actual representation). Moreover, it takes only a tiny bit of experimenting to figure out that expressions like (int)0 do as well. The latter is in itself a bit of a pita but it is conforming to the C++ standard which says:

4.10.1 A null pointer constant is an integral constant expression rvalue of integer type that evaluates to zero. […]

5.19.1 […] An integral constant-expression can involve only literals, enumerators, const variables or static data members of integral or enumeration types initialized with constant expressions, non-type template parameters of integral or enumeration types, and sizeof expressions. […]

3.9.1.7 Types bool, char, wchar_t, and the signed and unsigned integer types are collectively called integral types. A synonym for integral type is integer type. […]

Yes, not only (int)0 is a perfectly valid null pointer constant, but so are false, 1 - 1, sizeof(char) - sizeof(char), etc. Not only that, a const variable of type int with value of zero is also a valid null pointer constant.

This is not limited to C++ by the way. C has similar wording even though it treats fewer things as a constant expression. As a matter of fact, in the upcoming C++ standard it will become even worse as it adds more things to the definition of constant expression.

Like I’ve said, this comes to me as a bit of surprise and I have real trouble believing that it was C and C++ standard committees. Who could possibly want to represent a null pointer in a different way than plain 0 (or NULL (or nullptr)).

And now, a super important public service announcement: don’t feed the yao guai. Oh wait, wrong one. Beware of dereferencing a pointer cause you might assign null value to it instead of zeroing pointed to object.