Есть некоторые недостатки, связанные с тем, как иногда используются структуры, и это может быть опасно, если вы не продумываете последствия.
Например, если вы запускаете функцию:
void test(void) {
struct header;
char *p = &header.data[0];
...
}
Тогда результаты не определены (поскольку хранилище данных никогда не выделялось). Это то, о чем вы обычно будете знать, но есть случаи, когда программисты на С, вероятно, привыкли использовать семантику значений для структур, которая ломается различными другими способами.
Например, если я определю:
struct header2 {
int len;
char data[MAXLEN]; /* MAXLEN some appropriately large number */
}
Тогда я могу скопировать два экземпляра просто по присваиванию, т. Е .:
struct header2 inst1 = inst2;
Или, если они определены как указатели:
struct header2 *inst1 = *inst2;
Однако это не сработает, поскольку массив переменных data
не копируется. Вам нужно динамически распределить размер структуры по размерам и скопировать в массив значение memcpy
или эквивалентное.
Аналогично, написание функции, которая принимает структуру, не будет работать, так как аргументы в вызовах функций, опять же, копируются по значению, и, таким образом, то, что вы получите, вероятно, будет только первым элементом вашего массива data
.
Это не делает плохой идеей использовать, но вы должны иметь в виду, чтобы всегда динамически размещать эти структуры и передавать их только как указатели.