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