NULL-Pointer or (T*)0-Pointers? (was Re: randomness)

Martin Weitzel martin at mwtech.UUCP
Thu Apr 12 06:40:50 AEST 1990

In article <1990Apr11.001355.25937 at> scs at (Steve Summit) writes:
>In article <4878 at helios.TAMU.EDU> john at (John S. Price) writes:
>Make that
>	#include <sys/types.h>
>	srand((int)time((time_t)NULL));

Hmm, if I grep thru my /usr/lib/llib-lc (on a 386/ix) I find

	long	time(t) long *t; { return (0L);}

and grepping thru /usr/include/sys/types.h shows me

	typedef	long time_t; /* <time> type */

Now, could it be you really wanted to write --+
	srand((int)time((time_t *)NULL));

>This is not mere pedantry; it does make a difference.  I'm
>posting this reminder only because this code matches the one time
>I ever got burned by a realio, trulio int/pointer mismatch, and
>in case there is anyone out there who still isn't convinced that
>proper pointer casts are in fact necessary in function call

True, but what you in effect did was casting the NULL to a long !?!

>arguments.  Somehow I forgot the cast one day and typed
>srand(time(NULL)) into the planet's lowest quality/popularity

Strange, normally, NULL should match any pointer type (including
long* and time_t*) but ... maybe it was implemented not quite
clean (eg `#define NULL (0)' - what is sufficient for assigning
and comparing) ... or may it be that you mixed memory modells?

BTW: In my programms I have a strong tendency *not* to use
NULL at all. The reason is that in my opinion there is not
*one* single NULL-pointer in C, but as many (T*)0-pointers, as
there are types T. In other words: I compare the result of
`fopen' to `(FILE*)0', the result `fgets' to `(char*)0' and if
I construct a binary tree with nodes of type `struct tnode'
I usually write a `#define NULLNODE ((struct tnode *)0)'.

[some lines deleted]

>Watch those NULL pointers, folks.  (Yes; prototypes might have

... and so should `lint'.
Martin Weitzel, email: martin at mwtech.UUCP, voice: 49-(0)6151-6 56 83

More information about the Comp.lang.c mailing list