Date: Wed, 21 Aug 2002 03:45:37 +0200 From: Erik Trulsson <ertr1013@student.uu.se> To: Jon Mini <mini@FreeBSD.ORG> Cc: Archie Cobbs <archie@dellroad.org>, obrien@FreeBSD.ORG, freebsd-arch@FreeBSD.ORG Subject: Re: NULL Message-ID: <20020821014537.GA5553@falcon.midgard.homeip.net> In-Reply-To: <20020821012849.GK3751@elvis.mu.org> References: <20020821002116.GA33223@dragon.nuxi.com> <200208210101.g7L110m03801@arch20m.dellroad.org> <20020821012849.GK3751@elvis.mu.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Aug 20, 2002 at 06:28:49PM -0700, Jon Mini wrote: > Archie Cobbs [archie@dellroad.org] wrote : > > > When you say "not legal" do you mean it causes an error or a warning? > > > > FYI, this question came up when porting some code to redhat Linux, where > > NULL is defined as (void *)0. > > "Not legal" refers to the fact that C is a standardised language, > and this violates that standard. Whether or not it works in gcc is > irrellevant. Correction: This violates the C++ standard, not the C standard. In C NULL can be defined as either 0 or ((void*)0). In C++ only 0 is allowed. The reason for this is that C++ has stricter typechecking such that char *p = ((void*)0) is not allowed since one would assign a void pointer to a char pointer. This is allowed in C but not C++. In C you can always assign a void pointer to any other sort of pointer and it will automatically be converted to the corrct type. Not so in C++. > > Also, NULL is defined as 0 in the standard, because this: > > void *p; > > p = 0; > > Is guaranteed to produce an invalid pointer, and this: Not really invalid pointer, rather a pointer which is guaranteed not to point to any object. (And which will compare equal to any other null pointer and not equal to any valid non-null pointer.) > > ((p != 0) || (p == 0)) > > Tests for a valid pointer and an invalid pointer, respectively. Actually it tests for non-null pointer and null pointer respectively. Not all non-null pointers are valid. > > The fact that pointers are linear addresses in FreeBSD and Linux > and that the address value 0x0 is used for NULL are just some of > the happy coincidences that the relevant standards can't rely on, > and must define as "implementation dependant." True but irrelevant. > > On a related note, this : > > p = 1; > > Is illegal. Not illegal. It just causes undefined (or possibly implementation defined) behaviour. The compiler may (and usually will) accept. This is in contrast to C++ where char * p= ((void*0)) will cause a compilation error. > > I hope this makes sense. > > -- > Jonathan Mini <mini@freebsd.org> > http://www.freebsd.org/ -- <Insert your favourite quote here.> Erik Trulsson ertr1013@student.uu.se To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020821014537.GA5553>