Какой аббревиатура является членом "bk" в пределах mallo c. c? - PullRequest
2 голосов
/ 19 января 2020

Мой вопрос о бойце c. Как называется член bk, сокращенно malloc_chunk?

struct malloc_chunk {
  INTERNAL_SIZE_T      mchunk_prev_size;  /* Size of previous chunk (if free).  */
  INTERNAL_SIZE_T      mchunk_size;       /* Size in bytes, including overhead. */
  struct malloc_chunk* fd;         /* double links -- used only if free. */
  struct malloc_chunk* bk;
  /* Only used for large blocks: pointer to next larger size.  */
  struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
  struct malloc_chunk* bk_nextsize;
};

См .: https://code.woboq.org/userspace/glibc/malloc/malloc.c.html#malloc_chunk

1 Ответ

5 голосов
/ 19 января 2020

Элементы fd и bk - это прямой и обратный указатели в двусвязном списке.

Другими словами, fd - это указатель next, а bk - это указатель previous, как показано в следующем списке из трех элементов:

forward links -->
                       _(fd)_        _(fd)_
                      /      \      /      \      _(fd)-> NULL
                     /        V    /        V    /
      head ---> item1         item2         item3
               /    ^        /    ^        /
  NULL <-(bk)_/      \_(bk)_/      \_(bk)_/

<-- backward links

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


Фактически, ссылка, которую вы указали в своем вопросе, недвусмысленно утверждает это, начиная с пятидесяти с лишним строк после определения структуры (слегка перефразировано):

Free chunks are stored in circular
    doubly-linked lists, and look
    like this:
+------------------------------------------+
| Size of previous chunk, if unallocated   | <- mchunk_prev_size
+------------------------------------------+
| Size of chunk, in bytes (and some flags) | <- mchunk_size
+------------------------------------------+
| Forward pointer to next chunk in list    | <- fd
+------------------------------------------+
| Back pointer to previous chunk in list   | <- bk
+------------------------------------------+
:               <other stuff>              :
...