(Был 'Use std :: vector')
Редактировать:
Читая отзывы, я полагаю, что должен расширить свой ответ. Вы можете эффективно разместить два массива переменной длины в своей структуре следующим образом, и хранилище будет автоматически освобождено для вас, когда file_data выйдет из области действия:
struct nodeheader {
std::vector<unsigned char> data;
std::vector<unsigned char> friend_buf; // 'friend' is a keyword!
// etc...
};
nodeheader file_data;
Теперь file_data.data.size () и т. Д. Дает вам длину, а & file_data.data [0] дает вам необработанный указатель на данные, если вам это нужно.
Вы должны будете заполнить данные файла из файла по частям - прочитайте длину каждого буфера, вызовите resize () для вектора назначения, затем прочитайте данные. (Есть способы сделать это немного более эффективно. В контексте операций ввода-вывода на диске, я полагаю, это не имеет значения).
Кстати, методика О.П. неверна даже для его «хороших и модных» дел, например. только один VLA в конце.
char file_data[1024];
nodeheader* node = &(file_data[10]);
Нет гарантии, что file_data правильно выровнена для типа заголовка узла. Предпочитаю получать file_data с помощью malloc (), которая гарантирует возвращение указателя, выровненного для любого типа, или, в противном случае (лучше), объявляет буфер с правильным типом в первую очередь:
struct biggestnodeheader {
int flags;
int data_size;
char data[ENOUGH_SPACE_FOR_LARGEST_HEADER_I_EVER_NEED];
};
biggestnodeheader file_data;
// etc...