Трейлинг массива - PullRequest
       18

Трейлинг массива

10 голосов
/ 20 ноября 2010

Что такое Идиома конечного массива ?

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

Ответы [ 3 ]

10 голосов
/ 20 ноября 2010

Если вы имеете в виду идиому конечного массива, упомянутую в исходном коде 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;
}
1 голос
/ 20 ноября 2010

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

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 также может (разумно) использоваться только как последний член другой структуры, потому чторазмер хранилища не фиксирован - или как указатель.

1 голос
/ 20 ноября 2010

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

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

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

...