1. 程式人生 > >結構體指針之 段錯誤 具體解釋(segmentation fault)

結構體指針之 段錯誤 具體解釋(segmentation fault)

編譯 大型 進行 做了 不能 ack 程序 error 堆棧

一個網友問了我一個問題。一個C程序執行出現了段錯誤,這個問題非常好。非常多剛開始學習的人都easy犯這個錯誤,詳細代碼例如以下:

技術分享

這個編譯沒有問題,可是執行是段錯誤 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、用完了堆棧或堆空間(虛擬內存盡管巨大,但絕非無限)。


非常多都說犯這樣的低級錯誤一般都是對程序不熟練,我不贊同這樣的說話。當我們開發一個大型的項目時候,隨時都會出現這個問題,這樣的問題非經常見重要的是我們怎麽樣去調試。解決錯誤。

這裏給大家推薦幾個方法:

加入打印語句。二分法打印。

利用starce看系統調用

使用gdb命令來調試


無論是哪一種方法僅僅要可以解決你遇到的額問題,那麽就是非常好的。不要怕犯錯誤。重要的是可以解決錯誤。

結構體指針之 段錯誤 具體解釋(segmentation fault)