- Stack Overflow
- dynamic memory allocation:
- ulimit
- MultiThreading
Download : stackoverflow.c
在程式設計過程中你可能會不免會遇到segmentation fault,這樣的錯誤訊息除了有可能是因為非法存取未定義的記憶體位址之外,另外也有可能是你的堆疊溢位,例如下面這一個例子:
我的系統最大堆疊區塊為8MB,所以上面的程式一旦執行到func2()就會出現segmentation fault,程式執行到func1()時就已經佔用了超過4mb的stack空間,一旦函式進入func2()我們再宣告一個4mb的變數a,此時即會消耗掉超過8mb的stack空間,因此那傷眼的訊息segmentation fault就這麼出來了,為了解決這個問題,你可以透過下面的方式來處理:
使用動態記憶體配置的解決方式是一個最簡易的方法,你可以將原本的靜態變數a改成
char *a = (char*)calloc(MAX_VAR_SIZE,sizeof(char));
只是別忘了用完記得要釋放掉。
free(a);
如此一來每宣告一個a的變數,stack裡所消耗的空間就會從MAX_VAR_SIZE降到4bytes(指標的大小)。只是相對的動態記憶體配置就會比靜態配置多花一些時間。
如果想要加速運算的速度且又需要大的記憶體空間,這時你就必須修改系統的預設stack值,關於使用ulimit的方法你可以參考下面的網頁:
http://www.ss64.com/bash/ulimit.html
不特別強調ulimit的使用是因為一旦你變更了stack值之後,你的程式在其他系統上仍有crash的機會,除非你的程式需求只是單在某台電腦上做工程運算模擬。
MultiThreading固然是一個方案,因為每個Thread都有自己的stack空間,且 thread跟thread之前是可以通訊,但前提是你必須要將你的程式劃分為concurrent和parallel,且要非常的清楚thread的內部意義,否則你的程式除了變得很慢之外,也有可能很不幸的又收到segmentation fault的訊息。