null pointers (was: negative addresses)

Guy Harris guy at gorodish.Sun.COM
Tue Jun 21 06:26:48 AEST 1988


> ANSI C is not C.  Prototypes do not exist in C.  Please show me where in
> K&R that it states that "0" refers to the NULL pointer irrespective of the
> underlying implementation.

7.7 Equality operators

	...

	A pointer may be compared to an integer, but the result is machine
	dependent unless the integer is the constant 0.  A pointer to which 0
	has been assigned is guaranteed not to point to any object, and will
	appear to be 0; in conventional usage, such a pointer is considered to
	be null.

7.14 Assignment operators

	...

	However, it is guaranteed that assignment of the constant 0 to a
	pointer will produce a null pointer distinguishable from a pointer to
	any object.

Next question.

> ...if "0" does refer to the null pointer, why do some systems have #define
> NULL (-1) in stdio?

Because the implementors were ignorant.  Any language implementation that
defines NULL as -1, and purports to be an implementation of C, is broken.

Next question.

> My statement regarding casting is correct, since not all pointers need be 
> of the same size.  Prototypes eliminate this annoyance, but I live with
> a compiler void of prototypes :-(

Your statement regarding casting was:

> 	#include <stdio.h>	/*stupid place for NULL*/
> 	...
> 	Foobar *foobar;
> 	for (foobar = first; foobar != (Foobar*)NULL; foobar = foobar->next)
> 	{
> 	}

> (For code to be truly portable, NULL must be cast to the appropriate pointer
> type every time it is used since it is nothing more than an integer bit
> pattern :-)

which is absolutely, positively, INcorrect.  The cast is totally unnecessary in
the "for" loop in question; the compiler is quite capable of figuring out that
0 or NULL must be converted to a null pointer of type "Foobar *" before
comparing it, and all valid C compilers will do so (if you know of a compiler
that does not, it is invalid - period).

Furthermore, as there are no function calls whatsoever in your example,
prototypes have no effect.

The ONLY place where you are required to cast NULL properly is when passing
arguments to a procedure; prototypes eliminate that unless you have a function
(such as "execl") that takes a variable number of arguments or otherwise cannot
have its calling sequence fully described by a prototype.  Any valid compiler
will perform the required conversion automatically in all other cases
(assignments and comparisons, as described above).



More information about the Comp.lang.c mailing list