C99 поддерживает так называемый «гибкий» элемент массива, которому разрешено быть последним членом структуры. Когда вы динамически выделяете такую структуру, вы можете увеличить запрошенное количество с malloc()
, чтобы выделить память для массива.
Некоторые компиляторы добавляют это как расширение C90 и / или C ++.
Таким образом, вы можете иметь следующий код:
struct foo_t {
int x;
char buf[];
};
void use_foo(size_t bufSize)
{
struct foo_t* p = malloc( sizeof( struct foo_t) + bufSize);
int i;
for (i = 0; i < bufSize; ++i) {
p->buf[i] = i;
}
}
Вы не можете определить структуру с помощью элемента гибкого массива напрямую (как локальную или глобальную / статическую переменную), так как компилятор не будет знать, сколько памяти выделить для него.
Честно говоря, я не уверен, как вы могли бы легко использовать такую вещь с оператором new
в C ++ - я думаю, вам нужно было бы выделить память для объекта, используя malloc()
и использовать размещение new
. Может быть, может быть использована какая-то перегрузка, специфичная для класса / структуры operator new
...