【问题标题】:Accesing pointer of a structure from another structure从另一个结构访问结构的指针
【发布时间】:2017-04-09 08:16:22
【问题描述】:

我在分配到一个结构后遇到了内存泄漏

  struct List {
        struct node fNode;
  };

  struct node {
        int key;
  };

  void listInit(struct List * fList)
  {
        struct node * temp = malloc(sizeof(struct node));
        nodeInit(temp); // set value or something
        fList->fnode = *temp;
  }

  void listEmpty(struct List * flist)
  {
        nodeEmpty(&flist->fnode);
        memset(&flist->fnode, 0, sizzeof(struct node);
        free(&flist->fnode);
  }

我没有意识到 &flist->fnode 地址与 malloc 返回的临时地址不同。如何从结构列表再次访问地址?而且我不能将属性更改为指针,它必须是结构本身。

【问题讨论】:

  • This:free(&flist->fnode) 保证是错误的,因为从 operator & 返回的地址不可能是从 C 中的标准分配器函数生成的地址。事实上,struct Liststruct node 都没有指针成员。根据此代码的外观以及您陈述的问题/条件,我高度怀疑XY problem。这是为了解决什么问题
  • 我需要一种从 malloc 中获取指针的方法,以便正确释放分配的结构。
  • List 结构没有地方存储这样一个指针,你已经声明你不能改变结构(尽管我真诚地怀疑这些是“真正的”结构,因为它们就在附近- 毫无意义)。简而言之,以你所展示的,你不能从这里到达那里。除非目标是泄漏内存,否则您拥有的 malloc 毫无意义,因为没有地方可以保留它返回的地址。
  • 那么这意味着我能做到的唯一方法就是创建新的全局变量来存储指针?
  • 我不能说任何一种方式。我们仍然不知道正在解决的实际问题。 不是您在解决方案中遇到的问题;您的解决方案试图解决的实际问题。照原样(不多),有一件事是肯定的,malloc 是错误的。事实上,任何动态分配都是错误的,除非你有办法保留从它生成的地址。

标签: c pointers


【解决方案1】:

您不需要在列表中分配node。它是一个普通变量,而不是指针,并且在列表旁边分配。拨打InitNode(&fList.node) 就足够了,它应该可以工作。

但是,也许还有一些设计工作需要完成,因为在列表中拥有一个常规节点并不能为您带来任何好处。

【讨论】:

  • 正如我已经提到的,我不能改变结构。这只是一个例子,实际节点包含更多信息,它作为链表工作。
  • 很公平。响应的第一部分仍然有效。
【解决方案2】:

如果设置了结构,则不应该 malloc 节点,而是将其作为初始化列表的一部分进行初始化:

void listInit(struct List * fList) // Must be pointing to a valid list already.
{
  nodeInit(&fList->fNode);
}

你的作业想到的用例是这样的:

struct List myList; // Automatic ("stack") variable.
listInit(&myList); // The function initializes the variable, it doesn't allocate it

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2017-01-16
    • 2011-02-14
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多