Как гибкий массив реализован в C? - PullRequest
3 голосов
/ 16 ноября 2010
..
char arKey[1]; } Bucket;

Выше говорилось, что flexible array, как?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

Часто последнему члену структуры присваивается размер 0 или 1 (несмотря на то, что 0 не соответствует стандарту pre-C99, в некоторых компиляторах это разрешено, поскольку он имеет большое значение в качестве маркера).Поскольку обычно не создается массив размером 0 или 1, это указывает коллегам-программистам, что поле используется в качестве начала массива переменного размера, простирающегося от конечного члена в любую доступную память.

Вы также можете найти элемент структуры, определяющий точную длину гибкого массива, так же, как вы часто находите элемент, который содержит общий размер в байтах структуры.

Ссылки

Пример

typedef struct {
    size_t len;
    char arr[];
} MyString;

size_t mystring_len(MyString const *ms) { return ms->len; }

MyString *mystring_new(char const *init)
{
    size_t len = strlen(init);
    MyString *rv = malloc(sizeof(MyString) + len + 1);
    rv->len = len;
    strncpy(rv->arr, init, len);
    return rv;
}
0 голосов
/ 16 ноября 2010

Гибкие массивы должны иметь длину 0 в C99. Использование размера 1 - это C90, и теперь оно устарело.

По сути, такие гибкие массивы создаются путем вызова malloc с sizeof(Bucket) + array_length, где array_length - требуемый размер вашего массива. Затем разыменование указателя arKey (который должен быть последним членом вашей структуры) приведет к доступу к этой дополнительной памяти, эффективно реализуя объекты переменного размера.

См. Эту страницу для получения дополнительной информации:

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...