這裡說的動態陣列是可以根據需要動態增長占用記憶體的陣列,比如程式初始分配了100個元素,可是執行了一段時間後區區100個空間不能滿足了,現在需要400個,怎麼辦呢;那肯定需要再額外分配300個。
c語言有realloc()函式來解決空間擴充的問題,但是不要忘了realloc可能會遷移記憶體,很多時候陣列中的元素會被其它函式/模組引用,如果位址發生了變化,結果將是災難性的。
那麼stl的vector呢?它也有相同的問題。
一次分配足夠的空間是可以解決這個問題,很明顯這會造成記憶體的浪費,這個做法不算明智。
不使用陣列呢?使用list能解決一部分問題,但是list不能支援隨機訪問啊,鑑於效率上的硬傷,顯然不能隨便用list替換陣列。
怎麼解決這個問題呢?動態陣列!在hpserver 的demutex table就用到了動態陣列,事實證明效果不錯。
動態陣列是乙個很簡單易用的資料結構,但是簡單不代表優點小,它的特徵如下:
1 根據需要動態批量增長記憶體;
2 一經分配,元素位址不會再次變化;
3 實現簡單,效率高,事實上它和普通陣列相比基本沒有效率損失;
4 最大個數固定;
其實最重要的就是特徵2了,不然直接使用realloc多方便呢,當然動態陣列的實現也很方便,下面就會詳細說說。
特徵4實際上是個限制,但是相信我,你的程式不可能達到這個最大值。
如上面所說的,動態陣列實現起來很簡單,以下都假設陣列元素型別是t,首先需要乙個輔助資料結構。
view plain
copy to clipboard
print?
struct array_ele_s
; array_ele_s *parray[2000];
int isize;
變數parray是乙個array_ele_s型別的指標陣列,這個也就是你的動態陣列了;isize記錄了當前陣列的大小。
上面的**表明:
1 陣列每次動態增長1024個元素;
2 陣列的最大元素個數可以到:2000*1024個,如果這個還不夠,你可以把這個值改的更大點。
先來看看記憶體占用,parray本身占用2000*4,大約是8k的記憶體,基本可以忽略了。
如果一次分配乙個2000*1024的陣列array[2000*1024],那麼一次就要分配的記憶體是:2*sizeof(t) m,空間浪費嚴重。
再來看看效率,下面就從陣列最主要的操作——隨機訪問來看看它的效率如何;接下來再看看它是如何根據需要動態增長的。訪問指定的索引位置上的陣列元素,這個需要兩步計算,首先定位到元素在哪個子陣列上,然後再定位到子陣列的元素上;其實很簡單。
view plain
copy to clipboard
print?
t *get(int idx)
return null;
} 如果當前空間不夠,需要動態增長陣列,不然怎麼叫動態呢,基本思想就是如果需要的size超過當前的陣列大小,就需要增長陣列,直到能夠容納size個元素,**如下所示。
view plain
copy to clipboard
print?
int reclac(int size)
isize += 1024;
} return 0;
} 動態陣列就這麼多零碎了,怎麼樣,實現起來夠簡單吧。
C C 語言實現動態陣列
這裡說的動態陣列是可以根據需要動態增長占用記憶體的陣列,比如程式初始分配了100個元素,可是執行了一段時間後區區100個空間不能滿足了,現在需要400個,怎麼辦呢 那肯定需要再額外分配300個。c語言有realloc 函式來解決空間擴充的問題,但是不要忘了realloc可能會遷移記憶體,很多時候陣列...
C語言實現動態陣列
include include 要使用malloc是要包含此標頭檔案 include 要使用memset是要包含此標頭檔案 intmain for i 0 i 列印陣列 free p 釋放記憶體,malloc和free一定要記得成組使用,不然會導致程式吃記憶體 getchar 讓程式停頓,觀察輸出 ...
動態陣列C語言實現
dynamicarray.h created on 2019年7月22日 author jarvis ifndef src dynamicarray h define src dynamicarray h 動態增長記憶體 策略 將資料放到堆上 動態陣列 如果5個元素 申請記憶體 拷貝資料 釋放記憶體...