Свободный связанный список, содержащий структуры, содержащие структуры

В новых версиях VB.NET вы можете использовать встроенное выражение lambda вместо целого метода (если хотите)

Dim MyButton as New Button()
MyButton.Name = "MyButton"
AddHandler MyButton.Click, Sub(sender2, eventargs2)
                               'code to do stuff
                               'more code to do stuff
                           End Sub
1
задан Zest 17 January 2019 в 00:00
поделиться

2 ответа

Если у вас есть список ls записей для каждого файла в каталоге, где content - указатель на выделенный t_entry, содержащий имя файла и stat информацию, например,

typedef struct s_list {
    void          *content;
    size_t         content_size;
    struct s_list *next;
} t_list;

и

typedef struct s_entry {
    char       *filename;
    struct stat filestat;
} t_entry;

Функция freelist (t_list *head) должна будет выполнять итерацию по каждому узлу, а также:

  1. free filename, выделенных в каждом t_entry;
  2. free выделенный t_entry; и наконец
  3. free сам узел t_list.

Вы можете сделать что-то похожее на следующее:

void freelist (t_list *head)
{
    t_list *node = head;        /* temporary node to iterate list  */
                                /* (you could use head, but don't) */
    while (*node) {
        t_list *victim = node;  /* pointer to current node to free */
        t_entry *entry = node->content;     /* pointer to content */

        free (entry->filename)  /* free content->filename */
        free (entry);           /* free t_entry struct itself */

        node = node->next;      /* advance before freeing victim */

        free (victim);          /* free current t_list node (victim) */
    }
}

Обратите внимание, что вместо использования node, вы можете просто использовать head для итерации, поскольку freelist получает копию это не изменило бы адрес списка в любом случае - и так как список не останется, когда вы закончите, но гораздо лучше использовать временный узел для итерации списка (в любой функции), чтобы вы не путали обстоятельства, когда вы обрабатываете фактический адрес списка (например, параметр был t_list **) или копию указателя (параметр был t_list *).

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

0
ответ дан David C. Rankin 17 January 2019 в 00:00
поделиться

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

#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

typedef struct s_list
{
    void          *content;
    size_t         content_size;
    struct s_list *next;
}t_list;

typedef struct s_entry
{
    char       *filename;
    struct stat filestat;
}t_entry;

int main(void)
{
    t_list *foo = malloc(sizeof *foo);
    t_entry *bar = malloc(sizeof *bar);
    bar->filename = malloc(10);
    foo->content = bar;

    free(((t_entry *)foo->content)->filename);
    free(foo->content);
    free(foo);

    return 0;
}
0
ответ дан geckos 17 January 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: