【问题标题】:double pointer and structures双指针和结构
【发布时间】:2009-11-26 15:27:38
【问题描述】:

我很确定我没有做错任何事,但我还是想问一下。

我们有:

struct some_struct **array_of_ptrs = calloc (num, sizeof (struct some_struct*));

现在假设我只是将“数组”中的每个指针指向struct some_struct。现在肯定要释放内存,我只是这样做:

free (array_of_ptrs);

当然这是完全可以接受的?我问的原因是因为我在我的代码中做了类似的事情,而 gdb 抱怨一个免费错误。

【问题讨论】:

  • 如果您提供一个重现错误的最小程序会更好。
  • 我相信可以做到:struct some_struct **array_of_ptrs = calloc (num, sizeof *array_of_ptrs);
  • 在释放 array_of_ptrs 之前,您不将 array_of_ptrs[0] 释放到 array_of_ptr[num - 1] 吗?

标签: c pointers struct


【解决方案1】:

这看起来是正确的,只要你意识到你得到的是一个指针数组,而不是一个结构数组,并且你必须自己分配指针。听起来这就是你正在做的事情。

还请记住,您可以分配从 array_of_ptrs[0]array_of_ptrs[num-1]。如果你分配array_of_ptrs[num],你就有麻烦了。

【讨论】:

  • @graeme-perrow:谢谢 Graeme,我只是想要一些确认。一定有别的东西搞砸了我的代码。
【解决方案2】:

是的,你在这里所做的看起来是正确的。您正在分配一个 num 指针数组。因此,假设一个 4 字节指针,4 * num 字节,全部初始化为零。如果您随后将它们分别分配给另一个指针,那么当您 free 指针列表时,这不会造成问题。

gdb 到底在抱怨什么?是否会抱怨这些指针指向未释放的内容?如果实际结构本身是动态分配的,则释放指针列表不会释放它们各自指向的内容。

【讨论】:

  • @jeff-shattock:嗨,杰夫。我不认为它在抱怨指针指向的内容,不。我会尝试复制它并发布错误。谢谢。
【解决方案3】:

如果你这样做了

free(array_of_ptrs);
那么你正在影响创建内存泄漏,因为每个条目在该指针数组中都有一个指针,值得你花时间做一个
free(... );
在你首先 malloc 的每个指针上,然后发出最终的
free(array_of_ptrs);
。在使用指针处理链表时,这是非常相似的事情 而(!*array_of_ptrs){ 结构 *some_ptr_to_struct = *array_of_ptr; 免费(some_ptr_to_struct); *array_of_ptrs++; } 免费(array_of_ptrs);

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

  • @tommieb75:但我不会为数组中的这些指针分配任何内容。它们仅指向现有结构(稍后处理)。所以我看不出释放数组的每个成员有什么“意义”。
  • @tamb:哦,好吧,当你说'我只是将'数组'中的每个指针指向一个 struct some_struct 时。'我的印象是每个指针都是 malloc'd 并指向 some_struct* 的数组。很抱歉造成混乱。
【解决方案4】:

假设所有(struct somestruct *) 指针都指向已经分配的内存,是的,它看起来是正确的。

至于报错,你用的是什么版本的gcc?我在 4.3.3 上测试了代码,即使使用-Wall -pedantic,它也可以毫无问题地编译。

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 2013-10-14
    • 1970-01-01
    • 2011-11-30
    • 2021-11-26
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多