gcc編譯出現segmentation fault的錯誤
segmentation fault 即段錯誤,一般都是出現了非法的地址寫操作導致的。
常見的有如下幾種情況:
1、空指標訪問。
如果指標為空(NULL), 那麼對空指標的讀寫操作都會導致segmentation fault。
如
1 2 3 |
char *p = NULL;
printf ( "%c" ,*p); //讀操作
*p= 'A' ; //寫操作。
|
兩種操作任意一種都會導致segmentation fault。
2、指標指向非法區域後的寫操作。
C語言的指標指向了非法區域,然後對其寫入,會帶來不可預知後果,最嚴重的就是程式崩潰,此時也是segmentation fault。
比如
1 2 3 |
char *p = malloc (100); //申請100位元組空間
p+=1000; //超出申請範圍。
*p= 'a' ; //此時就有可能出現segmentation fault
|
或者
1 2 3 |
char *p = malloc (100); //申請記憶體
free (p); //釋放
*p = 'a' ; //此時p指向空間已經釋放,有可能被系統用作其它功能,對其賦值就可能出現segmentation fault。
|
3、常量空間破壞。
比如常量字串,如果修改其內容,則會出現segmentation fault。
如
1 2 |
char *p = "abcdef" ; //p指向常量字串。
p[1] = 'M' ; //修改常量空間,導致segmentation fault
|
4、在一些比較老的作業系統上,非對齊訪問也可能導致segmentation fault。
比如
1 2 3 4 |
int a[2];
char *p1 = ( char *)a; //指向陣列首地址。
int *p2 = ( int *)(p1+1); //實際上將a[0]和a[1]的各一部分,組成了一個新的int。 這時對p2的訪問,包括讀寫,都屬於非對齊訪問。
*p2=3; //此時有可能出現segmentation fault
|