[net.lang.c] Dynamic structures in C

ee161acv@sdccs5.UUCP (03/02/84)

	I want to have an element in a structure that points to the
	end of the structure, but I don't want any space allocated
	by 'C' for that element.  The reason for this is that I want
	the structure to have varying sizes, with the size depending
	on certain other parameters.  The following is the kind of
	thing I want:


------------------------------
struct	stuff
	{
	int	numchars;		/* Size of remainder of structure */
	char	chars[];		/* Allocate numchars chars for this
					   element */
/*###6 [cc] warning: illegal zero sized structure member: chars%%%*/
	};

main	()
	{
	int	num;			/* User input */
	struct	stuff	*block;		/* -> node to allocate */

	printf	("How many characters to allocate? ");
	scanf	("%d", &num);		/* Request info */
	block = (struct stuff *)calloc(1, sizeof(struct stuff) + num);
					/* Allocate enough memory for the
					   structure and the extra bytes */
	block->numchars = num;		/* Etc. */
	/* block->chars[0] = ... */
	}
------------------------------

	Of course this program runs (the warning does not stop it from
	compiling), but I also want to suppress the warning.  Is there
	any provision in C to allow me to do this?  Of course, I want
	the character string to be stored WITHIN the structure (as above)
	and NOT a character pointer to some string outside the structure.
	Also, I can't say that the end of the string is the first '\0'
	character, because I want them to be allowed in the string.

	In the mean time, I was able to solve the problem (with a bit
	of a comprimise on neatness) with this:

------------------------------
#define	FUDGEFACTOR	sizeof(char *)
#define	SIZEOF(type)	(sizeof(type) - FUDGEFACTOR)

struct	stuff
	{
	int	numchars;		/* Size of remainder of structure */
	char	chars[FUDGEFACTOR];	/* Allocate numchars chars for this
					   element */
	};

main	()
	{
	int	num;			/* User input */
	struct	stuff	*block;		/* -> node to allocate */

	printf	("How many characters to allocate? ");
	scanf	("%d", &num);		/* Request info */
	block = (struct stuff *)calloc(1, SIZEOF(struct stuff) + num);
					/* Allocate enough memory for the
					   structure and the extra bytes */
	block->numchars = num;		/* Etc. */
	/* block->chars[0] = ... */
	}

------------------------------------

	I would like to find a better way.

				Thanks for any suggestions,
					Victor Romano.

	P. S.  I also noticed that the directory files on 4.2 use
	dynamic structure sizes as well, so there's one application
	of this!



=========
Meek and obedient you follow the leader
down well trodden corridors into the valley of steel!
			-PF