1. 程式人生 > >segmentation fault/violation --段錯誤/違規

segmentation fault/violation --段錯誤/違規

當硬體告訴作業系統一個有問題的記憶體引用時,就會產生這種錯誤。作業系統通過向出錯的程序傳送一個訊號與之交流。訊號即一種事件通知或者一個軟體中斷,在NUIX系統程式設計中使用廣泛,但在應用程式程式設計中幾乎不使用。在預設的情況下,程序在收到“段錯誤”訊號後將進行資訊轉儲並終止。
一個小型的引起段錯誤的程式如下:

int *p=NULL;
*p=17;/*此處將引起一個段錯誤*/

通常導致段錯誤的幾個直接原因:
(1)解除引用一個包含非法值的指標;
(2)解除引用一個空指標(常常由於從系統中返回空指標,並未檢查就使用);
(3)在未得到正確的許可權時進行訪問:例如試圖往一個只讀文字段儲存值就是引起段錯誤;
(4)用完了堆疊或堆空間。

常見程式設計中可能導致段錯誤的陷阱:
(1)壞指標錯誤:在指標賦值之前就用其來引用記憶體;或者向庫函式傳送一個壞指標;或在對指標釋放之後再去訪問它所指向的記憶體,這種情況下可以修改free語句:free(q);q=NULL;
(2)改寫(overwrite)錯誤:越過陣列邊界寫入資料;或在動態分配的記憶體兩端之外寫入資料;或改寫一些堆管理資料結構(動態分配的記憶體之前的區域寫入資料就很容易發生段錯誤);
(3)指標釋放引起的錯誤:釋放同一個記憶體塊兩次(這種情況下有可能會報double free錯誤);或釋放一塊未曾使用malloc分配的記憶體;或釋放仍在使用中的記憶體;或釋放一個無效的指標。

for(p=start;p;p=p->next)
{
	free(p);
}

上例所示:程式在下一次迴圈迭代時,會對已經釋放的指標進行解除引用操作,從而導致段錯誤。