Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Mar 2002 19:00:30 +0100
From:      Erik Trulsson <ertr1013@student.uu.se>
To:        Ian <freebsd@damnhippie.dyndns.org>
Cc:        freebsd-hackers <freebsd-hackers@freebsd.org>
Subject:   Re: A few questions about a few includes
Message-ID:  <20020303180029.GA56041@student.uu.se>
In-Reply-To: <B8A7AB05.AAE6%freebsd@damnhippie.dyndns.org>
References:  <XFMail.20020303091938.conrads@cox.net> <B8A7AB05.AAE6%freebsd@damnhippie.dyndns.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Mar 03, 2002 at 10:27:17AM -0700, Ian wrote:
> > 
> > In <sys/proc.h>:
> > 
> > /*
> > * pargs, used to hold a copy of the command line, if it had a sane
> > * length
> > */
> > struct  pargs {
> > u_int   ar_ref;         /* Reference count */
> > u_int   ar_length;      /* Length */
> > u_char  ar_args[0];     /* Arguments */
> > };
> > 
> > This does indeed seem to make little or no sense.  Could someone explain
> > this?  Is ar_args supposed to be a pointer or what?
> 
> This is a common technique for defining a structure which is some
> descriptive information about an array of objects is followed by an
> open-ended array of those objects.  (In this case the "objects" are
> characters.)  The ar_args member of the structure gives a name to that
> location in the structure without reserving any space (and thus when the
> technique is used, there can only ever be one [0] member and it must be at
> the end of the structure).  You access the open-ended array of objects just
> as you would any other array embedded within a structure, E.G.
> instance->ar_args[n].
> 
> Not all compilers support defining zero-length arrays like this.  And that's
> a pity; it's an incredibly useful technique, and the alternatives to it are
> not nearly as elegant and generally involve ugly recasting of pointers.

For those compilers that don't support zero-length arrays one can still
use the same trick but with a one-element array at the end of the
struct. One just has to remember to that element into account when
allocating memory for the structure. Slightly uglier, but not much.

It might be worth mentioning that this trick is not actually allowed
according to the C standard and in principle invokes undefined
behaviour. OTOH, AFAIK the trick does work on all existing compilers,
so while it is not standard-conforming it is quite portable.


-- 
<Insert your favourite quote here.>
Erik Trulsson
ertr1013@student.uu.se

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020303180029.GA56041>