Связано: гибкий член массива во вложенной структуре
Я пытаюсь разобрать некоторые данные в структуру. Данные содержат информацию, организованную следующим образом:
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;
Вы можете игнорировать странную номенклатуру.
Мои строковые комментарии // A strings
, // B strings
и // unit strings
содержат строки C с завершающим нулем, номера которых совпадают с количеством записей структур unit_A
, unit_B
и unit
в данных. Например, если есть 5 записей A
в unit_container
, тогда будет 5 строк C в том месте, где написано // A strings
.
Поскольку я не могу использовать гибкие элементы массива в этих местах, как мне интерпретировать то, что по сути является неизвестным количеством строк C переменной длины в этих местах данных?
Например, данные в этих местах могут быть:
«Первая запись здесь. \ 0 Вторая запись \ 0Другая! \ 0Четвертая. \ 0Эта 5-я запись - лучшая запись по любым разумным стандартам. \ 0»
... что, как я полагаю, следует интерпретировать как:
char unit_A_strings[]
... но это невозможно. Какие у меня варианты?
Спасибо за внимание.
РЕДАКТИРОВАТЬ:
Я считаю, что пока что наиболее привлекательным вариантом является:
char** unit_A_strings;
, чтобы указать на массив строк символов.
Если я сделаю: char unit_A_strings[1];
, чтобы определить массив символов фиксированного размера из 1 символа, тогда я должен отказаться от sizeof (unit) и тому подобное, или возиться с размерами выделения памяти, даже если это наиболее точно соответствует типу имеющихся данных. То же самое произойдет, если я сделаю char * unit_A_strings[1];
.
Другой вопрос: В чем разница между использованием char *unit_A_strings;
и char** unit_A_strings;
?
Вывод:
Основная проблема заключается в том, что структуры предназначены для информации фиксированного размера, а мне нужна область памяти информации переменного размера. Поэтому я не могу законно хранить данные в структуре - по крайней мере, не как структуру. Это означает, что подойдет любая другая интерпретация, и мне кажется, что char**
- лучший доступный вариант для этой ситуации со структурой.
char**
или незаконныйchar*
- мои лучшие варианты. - person silent   schedule 12.06.2016char
s. Последний является указателем на (массив из?)char *
s. Они принципиально разные. Независимо от того, является ли это массив или нет, зависит от вас - и нормальный способ завершения массива - иметь конечное значение 0 / NULL. - person John Burger   schedule 12.06.2016