c程序中出現segment error 和 bus error 的原因


 

在c程序中,經常會遇到段錯誤(segment error)和總線錯誤(bus error),這兩種問題出現的原因可能如下

  • 段錯誤:
    1. 對一個NULL指針解引用。
    2. 訪問程序進程以外的內存空間。

  實際上,第一個原因可以規約到第二個原因,在一個c程序的虛擬內存空間中,從低地址到高地址一次是代碼區,堆區(向上增長),棧區(向下增長),最上是常量區,其中NULL指針的位置正好是虛擬內存中地址為0的位置,而這個位置是不屬於以上4個區域的,同理一些比較低的地址也不屬於這四個區,所以造成段錯誤的原因是訪問了程序虛擬內存空間4個區以外的地址,在平時的開發中,最大的可能還是對NULL進行了解引用。

  • 總線錯誤
    1. 對一個錯誤的起始地址進行解引用

  由於進程的虛擬內存空間實際上是對物理地址的一個映射,操作系統和編譯器會用內存對齊來做優化,通常就是4字節對齊,所以int,float這種類型的起始地址都是4的倍數,而short的起始地址是2的倍數,double的起始地址是8的倍數,假如此時對一個不是4倍數的地址a進行解引用 (int *) a,就可能會出現總線錯誤,這個出現的情況還要具體看是哪一種操作系統。總線錯誤一般不會出現,出現的情況多半是使用了指針的強制轉換。

轉自

http://transcoder.baidu.com/from=1086k/bd_page_type=1/ssid=0/uid=0/pu=usm%401%2Csz%40224_220%2Cta%40iphone___3_537/baiduid=CD36111FEA588A3E401AA4880A8FDE82/w=0_10_c+bus+error/t=iphone/l=3/tc?ref=www_iphone&lid=16572230499935529550&order=1&fm=alop&tj=www_normal_1_0_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&title=c%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%87%BA%E7%8E%B0segmenterror%E5%92%8Cbuserror%E7%9A%84%E5%8E%9F..._%E5%8D%9A%E5%AE%A2%E5%9B%AD&dict=30&sec=14407&di=9ed78506558585c4&bdenc=1&tch=124.1470986504959.65.182.1.550&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRASi4hMW0TUS4dgTCcshk1wXWj_XhunM5X&eqid=e5fc63d6148d28001000000257ad7906&wd=&clk_info=%7B%22srcid%22%3A%22www_normal%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1470986505829%2C%22xpath%22%3A%22div-a-h3%22%7D


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM