寫一個名爲my2DAlloc的函數,用它開闢一個二維數組

題目

寫一個名爲my2DAlloc的函數,用它開闢一個二維數組。儘可能地少用malloc函數, 並確保可以用arr[i][j]這種形式來訪問第i行第j列的元素。

解答

這道題目最簡單的方法就是先開一個數組來存儲指向每一行的指針, 然後再爲每一行動態地分配空間。這是非常常見的動態申請二維數組空間的方法:

 

上述方法使用了(rows+1)次的malloc,malloc使用過多會影響程序的運行效率, 那麼有沒有辦法減少malloc的使用呢。

雖然我們做的事情是動態申請二維數組空間,但這些申請的空間本質上是一維, 只不過有些空間存儲了地址,而有些空間則存儲了數據。比如上面的方法, 申請了一個長度爲rows的一維數組,裏面存放的是指針(int*),指向每一行的地址。 然後又申請了rows*cols大小的空間,裏面存放的是整型數據(int)。既然如此, 我們一次性將這麼多的空間申請下來,然後在該存放地址的空間存放地址, 在該存放數據的空間存放數據就OK了。

我們需要存儲指向每一行的地址,大小爲:

同時需要存儲rows*cols的整型數據,大小爲:

我們一次性將這些空間申請下來:

由於前面rows * sizeof(int*)的大小存放的是指針,因此arr類型是int**。 而跨過rows個單元后,後面存放的是整型數據,因此需要將其類型轉爲int*:

最後,從buf指向的地址開始,每cols個單元組成一行,將行首地址存放到arr 的相應位置即可。

代碼如下:

這樣一來,我們使用一次的malloc就可以動態地申請二維數組空間, 並且可以用arr[i][j]對數組元素進行訪問。


原文地址:http://www.cricode.com/2395.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章