结构

2012-09-13 46 views
0

的动态数组我有一段代码,我在网络上找到的,它位于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. 如何free()此阵完全?

由于

回答

2
  1. strarray是一个指向与每个指针指向的节点结构的指针数组。这是一个对象数组的基本表示形式。对于基本类型,只能使用一个*,因为它是指向一组基本类型的指针。你也可以为结构体做到这一点,这取决于你想要用数组来做什么。

  2. 是的,是的,你这样做。

  3. 首先迭代阵列上,释放每一个成员,然后释放该阵列。释放线索:释放你分配的所有东西。

+0

1)'基本类型',你的意思是int,double等等,对吗? – groove

+1

是,炭,短整型,长,布尔,浮点,双精度,长双和wchar_t的 – Minion91

1
  1. strarraystruct node **型的,因为它是struct node *动态分配的数组 - 即一个指针数组,其中每个元素指向一个struct node

  2. 不,根据你想要达到的效果,你可以简单地分配一块内存来保存X struct node,并将该指针分配给struct node *。谁写的代码分配的内存为数组指针的,这就是为什么他们于是向malloc调用为每个单独的struct node分配内存的人。

    使用指针的动态阵列,用于他们的可能性动态分配struct node,而不是调用realloc当简单地分配的连续struct node单个块可具有与减轻的成本(如果需要)做复制整个阵列。

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

+0

2)因此,我们可以定义'结构节点* starray'和分配存储器'strarray =(结构节点*)的realloc(strarray,2 * sizeof(struct node));',并立即修改新的2个元素,而不再有'内部'malloc?如果是的话,是否与@ Minion91的答案有冲突(因为struct不是基本类型)? – groove

+1

哦,但是你可以像结构体那样创建一个数组,但这取决于你想要用它做什么。 – Minion91

+0

@ Minion91所以我认为,在这种情况下,我只需要在循环和'free(strarray)'中使用'free(strarray [i] .str)',因为元素不是指针。但在原始代码中,我必须在循环中使用'free(strarray [i])'作为另外两个'free()'的补充。 – groove