Я пока не могу – мне тут valgrind какую-то дичь верещит.

Есть такой вот код:

struct entry_s {

    void (*handler) (void);

    struct entry_s *next;

};

typedef entry_s entry_t;


typedef struct {

    entry_t *first;
    entry_t *last;

} entries_t;


// сюда они добавляются в начале рантайма
static entries_t entries = { NULL, NULL };


// где-то ниже по коду дела

entry_t *entry = entries.first;

while (entry) {

    entry->handler();

    entry = entry->next; // valgrind: Invalid read of size 8
}

Вот скажи мне, как неойтишник, какого хуя ему не нравится?

  • ThePlayerZero
    link
    fedilink
    arrow-up
    0
    ·
    3 years ago

    Итак, получился односвязный список с тремя методами: push, pop, (сверху), append (под низ), но без pop_back. И по-прежнему с доступом за O(N) ко всем элементами, кроме верхних и самого последнего. Ну хз. Если и существует практический кейс, где нужно именно такое API, то мне он в голову не пришёл.

    Очередь (FIFO)

    Для фифо push не нужен, достаточно append и pop в этой терминологии

    • TheAnonymous
      link
      fedilink
      arrow-up
      0
      ·
      3 years ago

      push не нужен, но голова и хвост нужны

      • ThePlayerZero
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

        Ну так добавление в хвост и удаление с головы это и есть два метода (функции), а не три

        • TheAnonymous
          link
          fedilink
          arrow-up
          0
          ·
          3 years ago

          А причем здесь функции, в ОП вообще нет функций Это к «А нафига тут поле last вообще, если с него нельзя пойти в обратном направлении? Список то односвязный» На односвязном списке с поддержкой вставки в конец можно сделать очередь