乙個網友問了我乙個問題,乙個c程式執行出現了段錯誤,這個問題非常好,很多初學者都容易犯這個錯誤,具體**如下:
這個編譯沒有問題,但是執行是段錯誤 segmentation fault
因為你定義了乙個結構體指標p,用來指向此類結構體,但是你卻沒有給他賦值,此時p的值為null,你並沒有在記憶體中為p分配任何空間,所以p->a=1這句就會出段錯誤。
修改方法1:可以給p分配一段記憶體空間,並使其指向此空間:
p=(struct abc *)malloc(sizeof(struct abc));
p->a = 1;
方法2:可以讓p指向乙個已存在的記憶體空間:
struct abc temp;
p=&temp;
p->a = 1;
對付段錯誤問題利用strace命令可以快速找出現問題的地方!!!!!
為什麼會出現端錯誤呢?我也做了如下總結:
出現了segmentation fault,基本上的原因是,非法的記憶體訪問。
例如陣列的越界,在迴圈操作時迴圈變數的控制問題,也有字串拷貝時長度溢位,指標指向了非法的空間,還有就是申明乙個指標,但卻沒有對其初始化,就直接引用,或者沒有開闢記憶體空間就釋放記憶體,所以要檢查申請空間時間偶成功。
還有那個問題在除錯時會有這樣的資訊:program terminated with signal sigsegv, segmentation fault.
對於sigsegv這個訊號,經常會和sigbus訊號出現在一塊,
sigbus與sigsegv訊號的一般區別如下:
1) sigbus(bus error)意味著指標所對應的位址是有效位址,但匯流排不能正常使用該指標。
通常是未對齊的資料訪問所致。
2) sigsegv(segment fault)意味著指標所對應的位址是無效位址,沒有物理記憶體對應該位址。
通常導致段錯誤的幾個直接原因:
1、解除引用乙個包含非法值的指標。
2、解除引用乙個空指標(常常由於從系統程式中返回空指標,並未經檢查就使用)。
3、在未得到正確的許可權時進行訪問。
4、用完了堆疊或堆空間(虛擬記憶體雖然巨大,但絕非無限)。
C語言段錯誤
當我在linux下寫c語言的時候經常會遇到段錯誤.所以就來細究一下.段錯誤或段違規 segmentation violation 檢視expert c programming peter van der linden pg.156 解釋到段錯誤是由於記憶體管理單元 mmu 的異常所致,而該異常則通常...
C語言段錯誤
當我在linux下寫c語言的時候經常會遇到段錯誤.所以就來細究一下.段錯誤或段違規 segmentation violation 檢視expertc programming peter van der linden pg.156 解釋到段錯誤是由於記憶體管理單元 mmu 的異常所致,而該異常則通常是...
c語言 段錯誤 linux
當寫c語言時,經常遇到段錯誤,很多人都是用printf,但是當程式比較大時,就比較難找了,或者當程式執行時並不會立即出現段錯誤,而是經過很長一段時間才會出現那麼用printf顯然不行。這時就可以使用gdb來除錯了 首先檢視區塊數 核心資料轉存core檔案的上限,單位為區塊 詳細檢視ulimit使用 ...