Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 03 Mar 2002 10:27:17 -0700
From:      Ian <freebsd@damnhippie.dyndns.org>
To:        freebsd-hackers <freebsd-hackers@freebsd.org>
Subject:   Re: A few questions about a few includes
Message-ID:  <B8A7AB05.AAE6%freebsd@damnhippie.dyndns.org>
In-Reply-To: <XFMail.20020303091938.conrads@cox.net>

next in thread | previous in thread | raw e-mail | index | archive | help
> 
> 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.

-- Ian


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?B8A7AB05.AAE6%freebsd>