Related: flexible array member in a nested struct
I am trying to parse some data into a struct. The data contains information organized as follows:
struct unit { struct unit_A { // 28 bytes each // dependency r6scA 1 char dr6scA1_tagclass[4]; uint32_t dr6scA1_tagnamepointer; uint32_t dr6scA1_tagnamestringlength; uint32_t dr6scA1_tagid; // 12 bytes of 0x00 }A; // A strings struct unit_B { // 48 bytes each // dependency r6scB 1 char dr6scB1_tagclass[4]; uint32_t dr6scB1_tagnamepointer; uint32_t dr6scB1_tagnamestringlength; uint32_t dr6scB1_tagid; // 32 bytes of 0x00 }B; // B strings // unit strings }unit_container; You can ignore the weird nomenclature.
My line comments // A strings, // B strings and // unit strings each contain null-terminated C strings, the numbers of which coincides with however many unit_A, unit_B, and unit struct entries there are in the data. So like if there are 5 entries of A in unit_container, then there would be 5 C strings in the location where it says // A strings.
Since I cannot use flexible array members at these locations, how should I interpret what are essentially an unknown number of variable-length C strings at these locations in the data?
For example, the data at these locations could be:
"The first entry is here.\0Second entry\0Another!\0Fourth.\0This 5th entry is the bestest entry evah by any reasonable standards.\0"
...which I expect I should interpret as:
char unit_A_strings[]
...but this is not possible. What are my options?
Thank you for your consideration.
EDIT:
I think the most attractive option so far is:
char** unit_A_strings; to point to an array of char strings.
If I do: char unit_A_strings[1]; to define a char array of fixed size of 1 char, then I must abandon sizeof(unit) and such, or hassle with memory allocation sizes, even though it is most accurate to the kind of data present. The same situation occurs if I do char * unit_A_strings[1];.
Another question: What would be the difference between using char *unit_A_strings; and char** unit_A_strings;?
Conclusion:
The main problem is that structs are intended for fixed-size information and what I am needing is a variable-sized information memory region. So I can't legitimately store the data into the struct -- at least not as the struct. This means that any other interpretation would be alright, and it seems to me that char** is the best available option for this struct situation.
char**or an illegitimatechar*are my best options.chars. The latter is a pointer to (an array of?)char *s. They're fundamentally different. Whether it is an array or not is up to you - and the normal way of ending the array is to have a final value of 0 / NULL