最近a演算法題的時候碰到一道題:一個數列前三項都為1,之後每項的值等於前三項之和,求第20193024項的最後4位數字。一開始寫的代碼如下: 結果一直爆 Terminated due to signal: SEGMENTATION FAULT (11) 這個錯誤,改了好久沒改出來。之後在stackov ...
最近a演算法題的時候碰到一道題:一個數列前三項都為1,之後每項的值等於前三項之和,求第20193024項的最後4位數字。一開始寫的代碼如下:
結果一直爆 Terminated due to signal: SEGMENTATION FAULT (11) 這個錯誤,改了好久沒改出來。之後在stackoverflow上提問才找到自己錯誤所在。
這裡先介紹一下棧區(stack),堆區(heap),數據區(data seg)和代碼區。
棧區:由操作系統自動分配釋放,存放函數的參數值,局部變數的值;當不需要時系統會自動清除。
堆區:由new分配的記憶體塊,不由編譯器管,由應用程式控制(相當於程式員控制)。如果程式員沒有釋放掉,程式結束後,操作系統會自動回收。
數據區:也稱全局區或者靜態區,存放全局的東西類似全局變數。
代碼區:存放執行代碼的地方,類似if else,while,for這種語句。
原來在main函數裡面的數組是開在棧區(stack),在函數外面的是開在數據區的。棧區的記憶體比較小,所以當數組非常大的時候,就會報錯。假如把數組放在數據區就不會出現這個問題,因為數據區的記憶體很大。
修改後的代碼如下: