Пустые указатели в связанном списке в C

У меня есть программа, которая имеет функцию, которая возвращает void * в структуру, но я думаю, что я что-то упускаю при приведении данных.

Эта функция создает структуру, которая содержит строку и int. Строки считываются из файла.

void * buildWord(FILE * fin)
{
     void * ptr;

     char buf[100];
     Words * nw = (Words *)calloc(1, sizeof(Words));

     fgets(buf, 100, fin);
     strip(buf);
     nw->word = (char *)calloc(1, (strlen(buf) + 1));
     nw->length = strlen(buf);

     strcpy(nw->word, buf);

     ptr = &nw;

     return ptr;
}

Вот функция, которая вызывает это и принимает void *.

Node * buildNode(FILE * in, void *(*buildData)(FILE * in) )
{
     Node * nn = (Node *)calloc(1, sizeof(Node));

     nn->data = (Words*)((*buildData)(in));
     return nn;
}

Вот структура для узла

struct node
{
     void * data;
     struct node * next;
};
typedef struct node Node;

Я знаю, что создание структуры слова - это хорошо, но когда я перехожу к работе с узлами в списке, в нем нет данных. Я не уверен, почему это так. Спасибо!

2 ответа

Решение

Вам нужно пару изменений.

  1. Значение, возвращаемое из buildData не является правильным. Вместо

    ptr = &nw; // This is the address of nw. It will be
               // a dangling pointer once the function returns.
    
    return ptr;
    

    ты можешь использовать

    return nw;
    

    Вы можете избавиться от ptr из функции.

  2. Поскольку значение возвращается из buildData это другой указатель, чем вы использовали, использование возвращаемого значения buildData тоже нужно менять. Вместо

    nn->data = (Words*)((*buildData)(in));
    

    вам нужно использовать:

    nn->data = (Words*)buildData(in));
    

Ваша функция buildword объявляет переменную ptr который является локальным для области действия fucntion. Так что, когда вы возвращаете его, освобождается память, назначенная для переменной, что приводит к появлению висящего указателя.

Так что вместо того, чтобы использовать

ptr = &nw;
return ptr;

делать

return (void*)nw;

Другие вопросы по тегам