Я пока не могу – мне тут 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
}

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

  • deep-purpleOP
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    3 years ago

    Что такое односвязный список? Это стек, стопка. Ты можешь положить только наверх стопки, или взять сверху – всё.

    Если и существует практический кейс, где нужно именно такое API, то мне он в голову не пришёл

    То, о чём говоришь ты – FILO/LIFO.

    То, что нужно мне (не XOYO):

    1. Быстрая вставка в конец, поэтому в “холдере” entries есть поле last.

    2. Быстрое вынимание из любого места, поэтому в entry есть поля prev и next.

    3. Пробежка в цикле по тем элементам, которые там есть на момент пробежки.

    Тщем – это подписчики на событие.

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

      Ну ладно, сейчас что-то уже пропал энтузиазм обсуждать в эту сторону. По факту у тебя двусвязный список, чего мы тогда будем мусолить односвязный

      Что с багом то? Минимал так и не удалось построить? Ты с санитайзерами пробовал собирать и запускать свой (весь) код?

      • deep-purpleOP
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

        Баг дал понять, что внутри entry-хендлера какой-то гандон портит указатель на сам entry. Ну и по классике, оказалось, что этот гандон – я. Исправлено.