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;
}

这是一个调用this并接受void*的函数。

Node * buildNode(FILE * in, void *(*buildData)(FILE * in) )
{
     Node * nn = (Node *)calloc(1, sizeof(Node));
     nn->data = (Words*)((*buildData)(in));
     return nn;
}

以下是Node 的结构

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

我知道单词结构的创建很好,但当我处理列表中的节点时,里面没有数据。我不知道为什么。谢谢!

您需要进行一些更改。

  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,该变量是函数作用域的本地变量。因此,当您返回它时,为变量分配的内存将被释放,这导致了悬空指针的上升。

因此,与其使用

ptr = &nw;
return ptr;

进行

return (void*)nw

相关内容

  • 没有找到相关文章

最新更新