Path: utzoo!utgpu!watmath!att!dptg!rutgers!cs.utexas.edu!uunet!ginosko!aplcen!haven!adm!smoke!gwyn
From: gwyn@smoke.BRL.MIL (Doug Gwyn)
Newsgroups: comp.lang.c
Subject: Re: "do ... while ((NULL + 1) - 1);" -- valid C?
Message-ID: <10691@smoke.BRL.MIL>
Date: 9 Aug 89 20:35:48 GMT
References: <1043@levels.sait.edu.au> <961@virtech.UUCP> <10684@smoke.BRL.MIL> <696@ftp.COM>
Reply-To: gwyn@brl.arpa (Doug Gwyn)
Organization: Ballistic Research Lab (BRL), APG, MD.
Lines: 26

In article <696@ftp.COM> wjr@ftp.UUCP (Bill Rust) writes:
-In article <10684@smoke.BRL.MIL> gwyn@brl.arpa (Doug Gwyn) writes:
->In article <961@virtech.UUCP> cpcahil@virtech.UUCP (Conor P. Cahill) writes:
->>NULL + 1 is a valid operations, ...
->No!
-In my experience, NULL is always defined using the preprocessor line
-"#define NULL 0" (or 0L).

That's not always true, but anyway it's irrelevant...

-Since the while construct is relying on the fact NULL is, in fact, 0,
-doing NULL + 1 - 1 is ok.

The code example was adding 1 to the return value from strchr().
strchr() does not return a preprocessor macro; it returns a null macro
(when it doesn't return a pointer to a valid char object).  You are not
allowed to add 1 to a null pointer.  If you happen to get away with it,
you're just lucky; it's not correct code.

In any event, if you rely on NULL being defined (for example in )
as the source character string "0", then you're asking for trouble, since
it can be defined as any valid form of null pointer constant, including
for example "((void*)0)".  Indeed, it's rather expected that standard-
conforming implementations are more likely to choose the latter form.
Your program may suddenly stop working when a new release of the compiler
is installed, or when you port it to another environment.