Когда вы пишете struct Y
в этом контексте
struct X {
struct Y {
int z;
} y;
} x;
вы делаете две вещи:
- Определите
struct Y
и
- Добавьте поле
y
типа struct Y
внутри struct X
.
Четыре struct
, которые вы определяете, не зависят друг от друга. Каждый из ваших struct
определяет отдельный магазин, потому что внутри вашего struct country
нет коллекций.
Вот как вы можете определить свой магазин, используя определенные вами структуры:
// This is what the structure dictates, probably not what you want
struct country westpark;
strcpy(westpark.countryname, "Germany");
strcpy(westpark.state.statename, "Bavaria");
strcpy(westpark.state.city.cityname, "Ingolstadt");
strcpy(westpark.state.city.shop.shopname, "Westpark");
Однако это не похоже на то, что вы можете захотеть. Я думаю, вы искали что-то вроде этого:
struct country {
char countryname[100];
struct state {
char statename[100];
struct city {
char cityname[100];
int postal;
struct shop {
char shopname[100];
} shop[MAX_SHOP]; // maybe 128
int shopCount;
} city[MAX_CITY]; // Around 256
int cityCount;
} state[MAX_STATE]; // Probably 16
int stateCount;
} country;
Идея здесь состоит в том, чтобы построить страну как массив штатов, штат как массив городов и город как массив магазинов. Каждый уровень этой иерархии также хранит количество элементов на своем уровне, то есть stateCount
подсчитывает, сколько элементов массива state[]
было заполнено, cityCount
в каждом state[]
хранит количество city[]
элементов, которые были заполнены, и так далее.
Размер этого struct
будет около 50 МБ, поэтому не делайте его автоматической локальной переменной: это должна быть либо статическая внешняя область, либо статическая область действия, потому что 50 МБ — это слишком много для стека в большинстве случаев. системы. Вот как вы можете добавить свой магазин к этому struct
:
strcpy(country.countryname, "Germany");
country.stateCount = 1; // For Bavaria
strcpy(country.state[0].statename, "Bavaria");
country.state[0].cityCount = 1; // For Ingolstadt
strcpy(country.state[0].city[0].cityname, "Ingolstadt");
country.state[0].city[0].shopCount = 1; // for Westpark
strcpy(country.state[0].city[0].shop[0].shopname, "Westpark");
Обратите внимание, что это крайне неэффективно, поскольку предварительно выделяет все по максимуму. Следовательно, элементы массива state[]
, представляющие Бремен и Баварию, в конечном итоге будут иметь одинаковое количество предварительно выделенных элементов city[]
, даже несмотря на то, что Бавария намного больше и, вероятно, нуждается в большем количестве записей городов. Чтобы справиться с этим ресурсоэффективным способом, вам необходимо использовать динамическое выделение памяти.
person
Sergey Kalinichenko
schedule
17.09.2015