On Thu, Aug 21, 2008 at 1:47 AM, Thomas Engelmeier
<[EMAIL PROTECTED]> wrote:
>
> Am 21.08.2008 um 05:03 schrieb Michael Ash:
>
>>>> There was a common perception that NULL is not really the same as nil.
>>>> But
>>>> seems like in the end it really is (void*)0.
>>>
>>> They differ in type, not in value.
>>>
>>> "NULL" is (void *) 0.
>>> "nil" is (id) 0.
>>> "Nil" is (Class) 0.
>>
>> This is true conceptually but not as far as their actual definition.
>> NULL can be either 0 or (void *)0.
>
> Let's be a little bit more precise, I'll try to paraphrase correctly from my
> memory:
>
> a.)
> (int) NULL  is NOT required or guaranteed  0x0 by the standard. This is why
> one should never use
>   if( anPtr == (void *) 0 );
> instead of
>   if( anPtr == NULL );
> On modern machines, it usually is.

This is not true. Those two expressions are identical as far as C is
concerned, on any machine with a conforming C implementation (i.e.
(void*)0 and NULL are both valid null pointer constants.)

I think you are trying to say that the *representation* of a null
pointer needn't necessarily be all-bits-zero (i.e. you won't always
get a null pointer if you bzero/or memset it to zero). In that, you
are correct, but that is orthogonal to the discussion here (and there
is currently no C implementation with such null pointers that I know
of).

> b.) At least the C++ standard mandates for type conversion of an pointer to
> an boolean, that e.g. ( !anPtr )  is equivalent  to ( !(anPtr == NULL )).

I believe you mean that (!anPtr) is equivalent to (anPtr == NULL), in
which case, you are correct for C and C++.

> I didn't read the C99 spec but I'm sure there is something similar specified.
>
> This implementation detail

This is not an implementation detail, it is a guarantee of the
standards, and is essential to the C and C++ languages.

> does probably not matter on most platforms today
> as even microcontrollers have AFAIK linear address spaces.

The above is true on *any* C implementation, even those without a
linear address space.

> When I was writing my first C app on a DOS machine, there were segmented
> addresses. That meant  it could happen that
>
> ((somePtr + offset) - offset) == somePtr
>
> evaluated to false - (somePtr + offset) changed the segment, anotherPtr -
> offset did not. Big debug surprise for poor little 68020 fanboy ;-)

Indeed, but this is also a separate issue, even on DOS, (!anPtr) is
equivalent to (anPtr == NULL). Unless somePtr is a pointer to an array
or object that is at least (offset - 1) bytes in size, then ((somePtr
+ offset) - offset) causes undefined behavior on any platform (it just
dosen't usually manifest on platforms with a linear address space)

-- 
Clark S. Cox III
[EMAIL PROTECTED]
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to