2013-07-27 98 views
1

我正在初始化C 4.3.2中大小爲100000000的數組(unsigned short int),以及另外兩個大小爲1000000的int數組。但在提交Online判斷時,它給出了SIGSEGV錯誤。如何使用默認值動態初始化數組?

因此,我決定用默認值0動態初始化我的數組,因爲通過循環添加值需要很長時間。

我的問題是如何使用默認值動態初始化數組?

+7

100000000真的嗎? – P0W

+0

這樣的大小,通過類似UNIX系統的'mmap()'或Windows上的'VirtualAlloc()'直接向操作系統請求內存是有意義的。方便地,這些函數已經爲你的內存調零... – Christoph

回答

8

可以使用void *calloc(size_t nmemb, size_t size);函數0初始化存儲器,

calloc()函數爲nmemb元件尺寸的 每個字節的數組分配內存,並返回一個指針分配的內存。 內存設置爲zero如果nmemb或大小是0,然後calloc() 返回任一NULL,或者唯一的指針值,該值可以在以後是 成功傳遞到free()

calloc(number of elements, sizeof(type)); 

,或者您也可以使用memset()明確初始化由malloc()呼叫分配的內存。

注:calloc()不是魔術要麼 - 它會使用一個循環的地方全部用0來取代垃圾。

參見:Why malloc() + memset() is slower than calloc()?

+6

+1可能值得一提的是,'calloc()'也不是魔術 - 它也會**使用循環來代替垃圾全零。 – 2013-07-27 14:14:10

+1

@GrijeshChauhan你越來越好 –

+2

@Coffee_lover我現在失業了,所以我得到時間:P:D謝謝! –

0

不能消除初始化的時候,不管你做什麼。你能做的最好的就是嘗試優化吧。 2種技巧浮現在腦海中:

  • 高效地使用您的硬件。使用本機大小的內存訪問來初始化緩衝區。例如,超過32位體系結構循環並以4字節塊寫入。
  • 展開循環以消除控制開銷。

無論如何,展開將通過優化編譯器來應用。

您還可以嘗試將初始化開銷移至非關鍵部分。例如,你可以使用在程序啓動時將被初始化的靜態變量。或者,相比之下,您可以延遲初始化直到首次使用(延遲初始化)。

相關問題