Структура (заполнение и выравнивание, но не порядок) структуры может измениться, если вы компилируете свой код на другом компиляторе или более поздней версии компилятора, или даже с другими параметрами времени компиляции.
Это не будет меняться от запуска к запуску одной и той же скомпилированной программы - это будет кошмарный сценарий: -)
Таким образом, при условии, что одна и та же программа (или технически, любая программа, которая имеет ту же структуру структуры, закодированную в нее во время компиляции) является той, которая выполняет чтение, это будет работать просто отлично.
Соответствующие разделы стандарта C99:
6.2.6.1 / 1: представления всех типов не определены, кроме случаев, указанных в этом подпункте.
6.2.6.1 / 6 (единственное упоминание структур в этом подпункте): когда значение сохраняется в объекте структуры или типа объединения, в том числе в объекте-члене, байты представления объекта, соответствующие любому заполнению байты принимают неопределенные значения. Значение структуры или объекта объединения никогда не является представлением ловушек, даже если значение члена структуры или объекта объединения может быть представлением ловушек.
Это единственное упоминание о заполнении структуры в этом подпункте. Другими словами, это зависит от реализации, и им даже не нужно документировать ее (не указано, в отличие от реализации, которая будет требовать документирования).
6.7.2.1 / 13: ... Внутри объекта структуры может быть безымянный отступ, но не в его начале.
6.7.2.1 / 15: Там может быть безымянный отступ в конце структуры или объединения.
Если бы вы создавали версию 1.1 своей программы и в ней использовалась другая структура структуры (новый компилятор, другие параметры компилятора, #pragma pack
и т. Д.), Очень быстро стало бы очевидно, что у вас возникла проблема во время модульных тестов. (который должен включать загрузку в файл из предыдущей версии).
В этом случае вы могли бы включить в свою программу 1.1 некоторый «интеллект», который мог бы распознавать более раннюю разметку файла и преобразовывать данные по мере их поступления. Вот почему хорошие форматы файлов часто имеют индикатор версии (для разметки файла). версия, а не версия программы) в качестве первого элемента в этом файле.
Например, довольно многие из моих приложений используют идентификатор приложения вместе с 16-битным целым числом в начале файла, чтобы указать, какое приложение и версия оно есть, и часть программы загрузки файлов может обрабатывать, по крайней мере, текущая и предыдущие версии (и часто каждая версия, когда-либо созданная).
Версия программы и версия макета файла - это разные вещи - они могут дрейфовать, если, например, вы выпустили десять версий вашей программы без необходимости обновления макета файла.