Несмотря на то, что он не был «благословен», как в C, большинство компиляторов по-прежнему позволяют использовать «struct hack»:
struct variable_array {
size_t size;
char data[1];
};
«Хитрость» заключается в том, что когда вы выделяете его, вы выделяете достаточно места для данных, которые вы хотите сохранить (но это означает, что должно быть динамически выделено):
variable_array *a = (variable_array *) ::operator new(sizeof(*a) + data_size);
a->size = data_size;
Теоретически это не требуется для работы - компилятор может выполнить проверку ссылок на член data
, чтобы убедиться, что вы не индексируете ни один элемент, который вы ' мы определили его для хранения в определении структуры. На самом деле, я не знаю ни одного компилятора, который бы делал такие вещи, и вроде бы сомневался, что такая вещь существует. Довольно много кода на C делал такие вещи годами, поэтому компилятор, который делал такую проверку, просто не работал бы с большим количеством реального кода, даже если стандарт это допускает. C99 также добавляет это (с немного отличающимся синтаксисом) в качестве официальной функции языка.
Итог: это немного неуклюже, но возможность действительно не работать почти полностью теоретическая.