【问题标题】:Dynamic Array of Structures结构的动态阵列
【发布时间】:2012-09-13 07:30:57
【问题描述】:

我对在网络上找到的一段代码有一些疑问,该代码位于http://www.c.happycodings.com/Data_Structures/code9.html

  1. 为什么将 strarray 定义为 **
  2. 我们必须先malloc()这个数组,然后malloc()每个元素吗?

    strarray = (struct node **)realloc(strarray, (count + 1) * sizeof(struct node *));

    strarray[count] = (struct node *)malloc(sizeof(struct node));

  3. 如何完全释放()这个数组?

谢谢

【问题讨论】:

    标签: c arrays struct malloc realloc


    【解决方案1】:
    1. strarray 是一个指向指针数组的指针,每个指针指向一个节点结构。这是对象数组的基本表示。对于基本类型,您只能使用一个*,因为它是一个指向基本类型数组的指针。您也可以对结构执行此操作,这取决于您要对数组做什么。

    2. 是的,是的。

    3. 首先遍历数组,释放每个成员,然后释放数组。释放的线索:释放你分配的所有东西。

    【讨论】:

    • 是的,char、short int、long、bool、float、double、long double 和 wchar_t
    【解决方案2】:
    1. strarraystruct node ** 类型,因为它是struct node * 的动态分配数组 - 即。一个指针数组,其中每个元素都指向一个struct node

    2. 不,根据您要实现的目标,您可以简单地分配一块内存来保存 X struct node,并将该指针分配给 struct node *。编写该代码的人为一个指针数组分配了内存,这就是为什么他们随后调用malloc为每个struct node分配内存。

      他们可能使用动态指针数组来动态分配struct node,而不是简单地分配一个连续的struct node块,这可能与减少(如果需要)复制整个数组的成本有关拨打realloc时。

    3. 要释放内存,你需要做相反的事情。释放数组中的每个元素,然后释放整个数组。

    【讨论】:

    • 2) 那么,我们是否可以定义struct node *starray 并分配内存strarray = (struct node *)realloc(strarray, 2 * sizeof(struct node ));,并立即修改新的2 个元素而无需更多“内部”mallocs?如果是,是否与@Minion91 的回答有冲突(因为 struct 不是基本类型)?
    • 哦,但是你可以从结构体中创建一个这样的数组,但这取决于你想用它做什么。
    • @Minion91 所以我认为,在这种情况下,我只需要在循环中使用free(strarray[i].str)free(strarray),因为元素不是指针。但在原始代码中,我还必须在循环中使用 free(strarray[i]) 作为其他两个 free()s 的补充。
    • @groove:是的,您可以像这样分配和使用动态分配的 2 个 struct node 数组,这就是您通常会看到的。如果您实际上并没有重新分配内存,那么您可以坚持使用malloc 调用。
    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多