基於C語言中段錯誤的問題詳解

來源:互聯網
上載者:User

當我在linux下寫c語言的時候經常會遇到段錯誤.
所以就來細究一下.

段錯誤或段違規(segmentation violation)
查看Expert C Programming(Peter Van Der Linden) Pg.156
解釋到段錯誤是由於記憶體管理單元(MMU)的異常所致,
而該異常則通常是由於解除引用一個未初始化或非法的指標引起.

就是指標正在引用一個並不位於你的地址空間中的地址.
書中的例子

複製代碼 代碼如下:int *p = 0;
*p = 17;

這裡顯然 地址0 並不是你程式所在的地址空間 所能得到的
而我在實驗的時候 幾乎隨便給個地址 都是段錯誤
這也很正常,在運行之前是很難知道系統給你分配的地址空間的.

於是我這樣測試了一下
複製代碼 代碼如下:int *p = 0;
int a = 7;

printf("a addr is %d\n",&a);
scanf("%ld",&p);

printf("%d",*p);

由於 變數a的地址肯定在系統給你的程式所分配的地址空間內
所以你按照a的地址 給p賦值
或者小數目的向上下移4的整數倍 都是沒問題的
經測試 並無段錯誤

分析了一下原因
在linux中,當你malloc一段記憶體的時候 只是拿到了 這段記憶體的虛擬位址.而這段虛擬位址也名沒有實質的映射到物理地址.
而只有當你使用這段記憶體的時候.系統會申請相應頁表映射到相應的物理地址.
而*p直接隨意指向一個虛擬位址 而這個虛擬位址並沒有實際的物理地址與之映射.
這時候解引用會在MMU發出異常,返回到linux就會給使用者報一個段錯誤.
而如果你定義1個int型變數 這個應該是一個棧地址 核心已經把它映射到一個實際的物理頁
你在這個基礎上小幅度上下位移地址.相應的都應該有物理地址與之映射.
自然沒有問題.

以上都是自己的個人理解.可能還有不足的地方.
歡迎大家交流指教!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.