遇到的問題:程序在讀文件之后,准備執行fclose(fp);時,出現了如下錯誤:
Program received signal SIGSEGV, Segmentation fault.
解決方法:倒騰了好久,結果發現是一個小小的 & 在作祟。
原來把read( f, buff, nFileSize )
寫成了read( f, &buff, nFileSize ),多了一個 & !
經驗總結:
1.關於段錯誤(Segmentation fault):
所謂的段錯誤就是指訪問的內存超出了系統所給這個程序的內存空間,通常這個值是由gdtr來保存的,他是一個 48位的寄存器,其中的32位是保存由它指向 的gdt表,后13位保存相應於gdt的下標,最后3位包括了程序是否在內存中以及程序的在cpu中的運行級別,指向的gdt是由以64位為一個單位的表,在這張表中就 保存着程序運行的代碼段以及數據段的起始地址以及與此相應的段限和頁面交換還有程序運行級別還有內存粒度等等的信息。一旦一個程序發生了越界訪問,cpu 就會產生相應的異常保護,於是segmentation fault就出現了。
2.原因
在編程中以下幾類做法容易導致段錯誤,基本是錯誤地使用指針引起的:
1)訪問系統數據區,尤其是往系統保護的內存地址寫數據,最常見就是給一個指針以0地址
2)內存越界(數組越界,變量類型不一致等) 訪問到不屬於你的內存區域
3)其他
因此,需注意:
①定義了指針后記得初始化,在使用的時候記得判斷是否為NULL
②在使用數組的時候是否被初始化,數組下標是否越界,數組元素是否存在等
③在變量處理的時候變量的格式控制是否合理等
具體的解決方法可參考如下: