Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.std.c > #1747

Re: null pointer constant, address constant

From Shao Miller <sha0.miller@gmail.com>
Newsgroups comp.std.c
Subject Re: null pointer constant, address constant
Date 2012-12-18 14:02 -0500
Organization A noiseless patient Spider
Message-ID <kaqekj$8st$1@dont-email.me> (permalink)
References <kapqt2$es4$1@speranza.aioe.org>

Show all headers | View raw


On 12/18/2012 08:25, Szabolcs Nagy wrote:
>
> but it seems
>
>   0 ? (void*)0 : (void*)0
>
> is not a null pointer constant, nor an address constant
>
> it is mildly unexpected that this cannot be used as a
> null pointer constant
> (this matters when determining the type of ?: (6.5.15)
> expressions, assigning it to function pointers (6.5.16.1)
> or comparing it to function pointers (6.5.9))
>

It seems more useful as a "constant null pointer" than as a "null 
pointer constant," which is trivial.  This construct seems to allow you 
to sneak out of NPC semantics if desired, while still using a null 
pointer value, a 'void *' type, and no identifiable objects.

To follow your notes:

   x ? ptr : CNP

now has type 'void *' instead of the type of 'ptr',

   funcptr = CNP

contrasts a function type with an incomplete object type, and so do

   funcptr == CNP
   funcptr != CNP

> but (for me at least) it's more surprising that this is
> not even a constant expression that can be used in
> initializers, ie.
>
>   void *p = 0?(void*)0:(void*)0;
>

Why not?  6.6p7 says an initializer can evaluate to an address constant. 
  6.6p9 says an address constant can be a null pointer.  Your ternary 
yields one or the other of two such address constants that were created 
by a cast of a null pointer constant.  Could you point out what I've missed?

> another similar surprising case is
>
>   void *q = (void*)((char*)1 - (char*)1);
>

This doesn't surprise me.  The most portable code cannot assume that 
'(char *) 1' means anything.  I would not expect an implementation to 
deal with anything other than null pointer values and the addresses of 
actual functions and objects, at translation-time.  In the code you've 
shared, it bounces out of the realm of portability temporarily with the 
hope of returning to it, but I don't think it can be so.

- Shao Miller

Back to comp.std.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-18 13:25 +0000
  Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-18 09:53 -0500
    Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-18 20:06 +0000
      Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-18 15:39 -0500
        Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-19 00:44 +0000
          Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-18 20:24 -0500
            Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-19 10:27 +0000
              Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-19 07:15 -0500
              Re: null pointer constant, address constant Phil Carmody <thefatphil_demunged@yahoo.co.uk> - 2012-12-21 03:03 +0200
                Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-21 12:13 -0500
                Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2013-01-09 00:44 +0000
                Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2013-01-08 20:21 -0500
                Re: null pointer constant, address constant Eric Sosman <esosman@comcast-dot-net.invalid> - 2013-01-08 20:46 -0500
          Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 20:37 -0500
      Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 16:15 -0500
        Re: null pointer constant, address constant Keith Thompson <kst-u@mib.org> - 2012-12-18 15:52 -0800
          Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 19:12 -0500
            Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 19:51 -0500
          Re: null pointer constant, address constant Keith Thompson <kst-u@mib.org> - 2012-12-18 17:02 -0800
          Re: null pointer constant, address constant "christian.bau" <christian.bau@cbau.wanadoo.co.uk> - 2012-12-20 05:34 -0800
            Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-20 10:33 -0500
              Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-20 12:28 -0500
                Re: null pointer constant, address constant Tim Rentsch <txr@alumni.caltech.edu> - 2012-12-20 21:13 -0800
              Re: null pointer constant, address constant Tim Rentsch <txr@alumni.caltech.edu> - 2012-12-20 21:05 -0800
            Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-20 12:17 -0500
            Re: null pointer constant, address constant Keith Thompson <kst-u@mib.org> - 2012-12-20 12:10 -0800
              Re: null pointer constant, address constant Tim Rentsch <txr@alumni.caltech.edu> - 2012-12-20 21:25 -0800
  Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 14:02 -0500
    Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-18 20:09 +0000
      Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-18 15:54 -0500
        Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 16:18 -0500

csiph-web