[計程] [C] 陣列宣告太大就當掉的原因。

看板b02902HW作者 (貓龍)時間10年前 (2013/10/09 22:13), 編輯推噓6(600)
留言6則, 6人參與, 最新討論串1/1
同學好, 有同學反應當陣列宣太大程式就會當掉。例如 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

10/09 22:20, , 1F
最簡單的方法是宣告在main上面就好~
10/09 22:20, 1F

10/09 22:43, , 2F
有些比較差的作業系統(比如Windows) XD
10/09 22:43, 2F

10/09 23:08, , 3F
呵呵我計概的時候就偷聽到強者說了
10/09 23:08, 3F

10/09 23:10, , 4F
原來有這種事(筆記
10/09 23:10, 4F

10/10 00:46, , 5F
直接用map(逃
10/10 00:46, 5F

10/20 21:40, , 6F
linux 預設 8MB 只大8倍,還是很容易爆的...
10/20 21:40, 6F
文章代碼(AID): #1ILMIQAt (b02902HW)