Структура, которую вы указали, проста и может быть легко рассчитана как
(16+4+4+31*4+4)*5*15=11400 B
(я полагаю, что int равен 4B, что является спецификацией архитектуры c)
Однако упаковка структуры не всегда прямолинейный, и, например, тот же размер генерируется, когда cityName изменяется на 15 элементов.
Это зависит от компилятора и архитектуры, одно из лучших руководств по упаковке структуры можно найти здесь :
http://www.catb.org/esr/structure-packing/
Мы используем оператор sizeof, чтобы избежать путаницы при упаковке конструкций, как показано в примере ниже.
#include <stdio.h>
struct monYear {
int month, year;
};
struct perCity {
char cityName[15];
struct monYear my;
float temperature[31];
float avrg;
} fiveCities[5][15];
int main(void) {
printf("%zu\n", sizeof(fiveCities));
return 0;
}
Там это опция для принудительного использования компилятором указанного c размера упаковки, например, g cc имеет пакет #pragma:
#pragma pack(1)
struct test_structure {
char byte[1];
uint32_t dword;
};
#pragma pack()
Обычно это не рекомендуется, но в некоторых случаях может быть полезно , В приведенном выше примере размер структуры составляет 5 байтов, тогда как без #pragma pack
это будет 8.