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