iT邦幫忙

0

c語言: 什麼時候必用malloc而不直接宣告陣列?

不明 2020-03-27 15:09:4816187 瀏覽

大家好,想問一個c語言的觀念問題,
什麼時候必用到malloc語法?

我知道malloc的語法,
譬如說要宣告一個5*4的int二維陣列,
我們可以這樣寫:

int **Array;
Array = (int**)malloc(5*sizeof(int*));
for(int i=0;i<5;i++)
{
    Array[i]=(int*)malloc(4*sizeof(int));
}

但是要宣告一個5*4的int二維陣列,
我們可以簡單寫int Array[5][4];就好,
比用malloc的語法簡單很多

有沒有什麼情境,
是用malloc動態宣告陣列比直接宣告一個固定大小陣列恰當的例子呢?

謝謝~

比較多是效能考量,很常用在你無法肯定會須要多大空間array的狀態下,因為真的計較效能時,你也不可能直接切很大一塊記憶體在那邊,很容易導致整個演算法瘋狂發生cache miss等問題,我之前上學校平行處理寫動態矩陣相乘時,依照對矩陣的切割也就有各種需求,那malloc使用完也都須要立即釋放(free)記憶體。
不明 檢舉
謝謝你的回答~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
通靈亡
iT邦高手 1 級 ‧ 2020-03-27 15:26:13
最佳解答

這兩個不知道是不是你想要的?

如果一開始我們就宣告陣列的大小,如果我們沒用那麼多的話就浪費,如果用太多、超過的話又會造成 runtime error,怎麼辦呢?這就是為什麼要使用動態記憶體的原因了,因為動態配置陣列,可以隨心所欲的控制陣列的元素個數。這篇暫以指標動態配置一維陣列為例。

https://edisonshih.pixnet.net/blog/post/27974938

....................................................

多維動態陣列在 C 中 大概只能用 malloc,但這在一維時尚不構成問題,但需要多維陣列時怎麼辦呢?這算是程式論壇最常被問到的問題之一了。

https://lagunawang.pixnet.net/blog/post/7741220-%5B%E8%BD%89%E9%8C%84%5Dc-c%2B%2B-%E7%9A%84%E5%A4%9A%E7%B6%AD%E5%8B%95%E6%85%8B%E9%99%A3%E5%88%97

不明 檢舉

感謝資源提供,還蠻有幫助的

1
一級屠豬士
iT邦大師 1 級 ‧ 2020-03-27 16:02:13

例如你寫一個掃描某個目錄底下檔案的函數,因為數量不定,你可能會使用Linked List資料結構,
搭配使用malloc.
當然要使用固定的Array 也未嘗不可,只要你把機制處理好,但是這時候要去維持這個機制(例如計數器,還有判斷式),看哪邊成本(執行成本或是維護成本)可以自行取捨.
也沒有絕對哪種好啦.
有時候耍帥也是一種追求.

不明 檢舉

感謝分享想法哦~

1
小魚
iT邦大師 1 級 ‧ 2020-03-27 16:49:09

現在很多都有幫你寫好了,
譬如C++的vector等等的,
C#的List之類的,
要全部自己寫是很痛苦的...
尤其對於初學者來說很容易出問題.

通常我們不確定陣列會多大,
譬如說使用者輸入一個大小之後才建立陣列,
或是檔案讀進來之後才知道大小,
就會需要用到malloc,
但是你動態配置之後,
如果用不到了就要釋放,
要不然就會造成所謂的memory leak,
而導致最後可能程式會Crash或其他問題...

不明 檢舉

謝謝分享想法~

我要發表回答

立即登入回答