Пустые указатели в связанном списке в 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 ответа
Вам нужно пару изменений.
Значение, возвращаемое из
buildData
не является правильным. Вместоptr = &nw; // This is the address of nw. It will be // a dangling pointer once the function returns. return ptr;
ты можешь использовать
return nw;
Вы можете избавиться от
ptr
из функции.Поскольку значение возвращается из
buildData
это другой указатель, чем вы использовали, использование возвращаемого значенияbuildData
тоже нужно менять. Вместоnn->data = (Words*)((*buildData)(in));
вам нужно использовать:
nn->data = (Words*)buildData(in));
Ваша функция buildword
объявляет переменную ptr
который является локальным для области действия fucntion. Так что, когда вы возвращаете его, освобождается память, назначенная для переменной, что приводит к появлению висящего указателя.
Так что вместо того, чтобы использовать
ptr = &nw;
return ptr;
делать
return (void*)nw
;