Что такое Idialom Trailing Array?Идентификатор прицепного массива
P.S: Googling этот термин дает Векторы реализованы с использованием идиомы конечного массива, поэтому они не изменяются по размеру без изменения адреса самого векторного объекта.
Что такое Idialom Trailing Array?Идентификатор прицепного массива
P.S: Googling этот термин дает Векторы реализованы с использованием идиомы конечного массива, поэтому они не изменяются по размеру без изменения адреса самого векторного объекта.
Если вы имеете в виду идиому трейлинг массив упоминается в GCC source code (где ваша цитата из), это, кажется, относится к старому 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;
}
Если это имеет в виду это, тем более общим термином является [struct hack] (http://stackoverflow.com/q/3711233/168225). –
@Georg: Я не думаю (хотя я не уверен) это означает, что иначе термин (как вы уже упоминали) 'struct hack' использовался бы вместо' Trailing array idiom'. –
@Prasoon: Возможно, автор просто использовал другой термин, не первый раз, когда кто-то это сделал. «Struct hack» звучит немного неформально. –
Как представляется, это относится к массивам в структурах, которые могут иметь переменный размер массива. См:
http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx и http://sourceware.org/gdb/current/onlinedocs/gdbint/Support-Libraries.html
Еще один совет, если вы Google для выражения поместить выражение в «» как «задний массив», это даст вам более конкретные результаты. Google знает о трейлинг-массивах.
+1 для ссылки на статью MSDN, интересный материал , –
Я думаю, что имеется в виду:
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
также может быть (только обоснованно) использован как последний элемент другой структуры, поскольку размер хранилища не фиксирован - или как указатель.
Это называется «гибким элементом массива» и находится в стандарте C99 (§6.7.2.1P16). – aib
Как другие прокомментировали некоторые ответы ниже, вам лучше повезти в поисках _flexible array member_. – ninjalj
Обратите внимание, что при строгом определении это вызывает _UB_: http://stackoverflow.com/questions/3711233/is-the-struct-hack-technically-undefined-behavior – sbi