【问题标题】:Void pointers in a Linked List in CC语言链表中的空指针
【发布时间】:2016-02-14 15:45:01
【问题描述】:

我有一个程序,它有一个函数可以将一个 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;

我知道单词结构的创建很好,但是当我开始使用列表中的节点时,其中没有数据。我不确定为什么会这样。谢谢!

【问题讨论】:

  • ptr = &nw; 应该是ptr = nw;nw 已经是一个指针)
  • 另外,请学习 Not 转换 malloc/calloc 等的返回值。Words * nw = (Words *)calloc(1, sizeof(Words)); 应该是 Words * nw = calloc(1, sizeof(Words)); 或者只是 Words * nw = calloc(1, sizeof *nw); malloc/calloc 仅返回而已比新创建的内存块的起始地址。它只是一个地址,而不是char 地址或int 地址——只是一个地址。
  • 既然你把它标记为C++,为什么不直接使用std::list<Words>呢?
  • @DavidC.Rankin 如果 OP 将删除 C++ 标签,您的评论是有意义的。如果 OP 使用C++,则需要强制转换。如果 OP is 使用 C++,则放弃所有这些并使用 std::list
  • 感谢您的建议,并对 c++ 标签感到抱歉。这确实在c中。我删除了标签。

标签: c linked-list function-pointers nodes void-pointers


【解决方案1】:

您需要进行一些更改。

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

【讨论】:

    【解决方案2】:

    您的函数buildword 声明了一个变量ptr,它是函数范围内的局部变量。因此,当您返回它时,分配给该变量的内存被释放,从而导致悬空指针的上升。

    所以而不是使用

    ptr = &nw;
    return ptr;
    

    return (void*)nw;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      相关资源
      最近更新 更多