2010-11-20 1 views
10

Что такое Idialom Trailing Array?Идентификатор прицепного массива

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

+0

Как другие прокомментировали некоторые ответы ниже, вам лучше повезти в поисках _flexible array member_. – ninjalj

+0

Обратите внимание, что при строгом определении это вызывает _UB_: http://stackoverflow.com/questions/3711233/is-the-struct-hack-technically-undefined-behavior – sbi

ответ

10

Если вы имеете в виду идиому трейлинг массив упоминается в 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; 
} 
+3

Если это имеет в виду это, тем более общим термином является [struct hack] (http://stackoverflow.com/q/3711233/168225). –

+0

@Georg: Я не думаю (хотя я не уверен) это означает, что иначе термин (как вы уже упоминали) 'struct hack' использовался бы вместо' Trailing array idiom'. –

+0

@Prasoon: Возможно, автор просто использовал другой термин, не первый раз, когда кто-то это сделал. «Struct hack» звучит немного неформально. –

1

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

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

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

+0

+1 для ссылки на статью MSDN, интересный материал , –

1

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

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

+0

Это называется «гибким элементом массива» и находится в стандарте C99 (§6.7.2.1P16). – aib

Смежные вопросы