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>