結構

2012-09-13 54 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