Идентификатор Trailing Array

Что такое Идентификатор Trailing Array?

P.S: Googling этот термин дает. Векторы реализуются с использованием идиомы конечного массива, поэтому они не изменяются по размеру без изменения адреса самого векторного объекта.

Ответ 1

Если вы имеете в виду идентификатор конечного массива, упомянутый в исходный код GCC (откуда приходит ваша цитата), похоже, это ссылка на старый C трюк для реализации динамического массива:

typedef struct {
    /* header */
    size_t nelems;

    /* actual array */
    int a[1];
} IntVector;

где массив будет создан с помощью

IntVector *make_intvector(size_t n)
{
    IntVector *v = malloc(sizeof(IntVector) + sizeof(int) * (n-1));
    if (v != NULL)
        v->nelems = n;
    return v;
}

Ответ 2

Кажется, это относится к массивам в структурах, которые могут иметь переменный размер массива. См:

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx а также http://sourceware.org/gdb/current/onlinedocs/gdbint/Support-Libraries.html

Еще один совет, если вы Google для выражения положите выражение в "как" trailing array", это даст вам более конкретные результаты. Google знает о трейлинг-массивах.

Ответ 3

Я думаю, что имеется в виду:

struct foo {
  ... some data members, maybe the length of bar ...
  char bar[]; /* last member of foo, char is just an example */
};

Используется путем выделения с помощью malloc(sizeof(struct foo)+LEN), где LEN - желаемая длина bar. Таким образом, требуется только один malloc. [] может использоваться только с последним членом структуры.

И, поскольку я понимаю документ GCC, struct foo также может быть (только разумно) использован как последний член другой структуры, поскольку размер хранилища не фиксирован - или как указатель.