Идиома завершающего массива

Что такое Идиома завершающего массива?

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


person Prasoon Saurav    schedule 20.11.2010    source источник
comment
Как другие прокомментировали некоторые ответы ниже, вам больше повезет с поиском гибкого члена массива.   -  person ninjalj    schedule 20.11.2010
comment
Обратите внимание, что по строгому определению это вызывает заголовок UB: stackoverflow.com/questions/3711233/   -  person sbi    schedule 20.11.2010


Ответы (3)


Если вы имеете в виду идиому завершающего массива, упомянутую в исходном коде 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;
}
person Fred Foo    schedule 20.11.2010
comment
Если это относится к этому, более распространенным термином является взлом структуры. - person Georg Fritzsche; 20.11.2010
comment
@Georg: Я не думаю (хотя я не уверен), что это относится к тому, что в противном случае термин (как вы упомянули) struct hack использовался бы вместо Trailing array idiom. - person Prasoon Saurav; 20.11.2010
comment
@Prasoon: автор, возможно, просто использовал другой термин, это было бы не в первый раз, когда кто-то делал это. Struct hack в любом случае звучит немного неформально. - person Georg Fritzsche; 20.11.2010
comment
@Prasoon, этот комментарий раскрывает это: это означает, что у вас не может быть переменных или полей векторного типа - всегда используйте указатель на вектор. Единственным исключением является конечное поле структуры, которое может быть векторным типом. Я признаю, что никогда не слышал, чтобы это называлось идиомой замыкающего массива, но в этом есть некоторый смысл. - person Fred Foo; 20.11.2010
comment
@larsmans: Да, это имеет смысл. Принял ваш ответ. :) - person Prasoon Saurav; 20.11.2010
comment
@Georg Fritzsche: По иронии судьбы, термин struct hack появляется в стандарте. - person aib; 20.11.2010
comment
@aib только в указателе, чтобы указать на стандартную терминологию: «взломать структуру, см. гибкий элемент массива» - person Pete Kirkham; 20.11.2010
comment
Я единственный, кто находит эту гибкость чрезвычайно смущающей. Это аккуратно нарушает любое использование sizeof... - person Matthieu M.; 20.11.2010
comment
@Matthieu M.: нравится вам это или нет, это довольно распространенная идиома в C (по крайней мере, с тремя разными именами). Я видел это в коде операционной системы, в библиотеках, а теперь и в GCC. - person Fred Foo; 21.11.2010

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

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

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

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

person smilingthax    schedule 20.11.2010
comment
Это называется гибким элементом массива и входит в стандарт C99 (§6.7.2.1P16). - person aib; 20.11.2010