[爆卦]c語言陣列宣告是什麼?優點缺點精華區懶人包

為什麼這篇c語言陣列宣告鄉民發文收入到精華區:因為在c語言陣列宣告這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者andy88566y (貓龍)看板b02902HW標題[計程] [C] 陣列宣告太大就當掉的原因...


同學好,



有同學反應當陣列宣太大程式就會當掉。例如



int arr1[20][20]; 這樣做沒問題,測資也通過。



int arr2[512][512]; 這樣做程式在自己電腦竟然直接當掉,但傳



到judgegirl是全對5分。



這是由於記憶體大小的關係。sizeof(arr2)是4x512x512,大約1MB



有些比較差的作業系統(比如Windows)限制只能用不超過1MB記憶體



所以arr2會導致值程式當掉。如果你使用Linux,Mac等,arr2就沒



問題。



因此如果同學在Windows下寫程式,遇到這問題解法有:



1. 捨棄Windows,使用更適合寫程式的作業系統如Linux



2. 在編譯時加上參數 -Wl,--stack,8000000 例如



gcc -Wl,--stack,8000000 hw10.c



這意思是告訴編譯器這個程式要用8000000(大約8MB)的記憶體,而



不受限於原本的1MB,當然8000000也可以改成其他你喜歡的數字,



只要記得比你要用到的記憶體量大。



3. 如果你很確定你寫的程式碼是正確的,當掉的唯一理由是因為



陣列太大。那就乾脆直接上傳到judgegirl, 如果你真的是對的,



judgegirl不會因為這種陣列理由當掉,她一定會還你清白的!



judgegirl宣告到1024x1024都還沒問題。



4. 使用以後才會教到(或許這學期教不到)的語法、程式技巧。



例如static變數,也就是在宣告前加static這個字:



static int arr2[512][512]; //這樣就不會當掉了,很單純吧!



或是全域變數,把陣列的宣告放在main()的前一行:



int arr2[512][512]; //移到main前面就不會當掉了!

main()

{

....



還有很多其他還沒教的方法,但詳細理由現在無法解釋,



需等各位學到更後面。但這封信內已經提供數種解法了。



如果各位對這問題還有疑慮,請寄信問我。





by 江懿

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.162.101.198
skgg:最簡單的方法是宣告在main上面就好~ 10/09 22:20
winston1907:有些比較差的作業系統(比如Windows) XD 10/09 22:43
kchiazo:呵呵我計概的時候就偷聽到強者說了 10/09 23:08
Hyww13:原來有這種事(筆記 10/09 23:10
mudream:直接用map(逃 10/10 00:46
cebrusfs:linux 預設 8MB 只大8倍,還是很容易爆的... 10/20 21:40

你可能也想看看

搜尋相關網站