結構體指針之 段錯誤 具體解釋(segmentation fault)
一個網友問了我一個問題。一個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)