麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

C語言中段錯誤的問題處理

2020-02-24 14:32:31
字體:
來源:轉載
供稿:網友

不知道大伙是不是跟武林小編一樣,當我在linux下寫c語言的時候經常會遇到段錯誤,為此,今天我們就來仔細研究一下,給出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型變量 這個應該是一個棧地址 內核已經把它映射到一個實際的物理頁
你在這個基礎上小幅度上下偏移地址.相應的都應該有物理地址與之映射.
自然沒有問題.

以上都是武林技術小編自己的個人理解,可能還有不足的地方,在此虛心歡迎大家交流指教!

?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 中文字幕在线播放视频 | 亚洲网站免费 | 最新se94se在线欧美 | 国产精品免费一区二区 | 欧美日韩在线播放一区 | 激情网站免费观看 | 久久久久国产精品久久久久 | av电影在线观看网址 | 黄网站在线免费看 | 亚洲午夜精品视频 | 免费在线中文字幕 | 免费黄色成人 | 亚洲第一成人在线视频 | av电影在线网 | 国产精品一区二区三区在线播放 | 国产精品一区二区三区在线看 | 欧美一级黄 | 国产在线导航 | 久久网站热最新地址4 | 91麻豆精品国产91久久久无需广告 | 91精品国产92久久久久 | 97超级碰碰人国产在线观看 | 高潮娇喘嗯啊~文字 | 国产无遮挡一区二区三区毛片日本 | 黄片毛片一级 | 免费网站看v片在线a | 色播亚洲 | 蜜桃网站免费 | 国产成人精品无人区一区 | 日韩中文字幕一区二区三区 | 欧美另类综合 | 国产欧美一区二区三区免费看 | 精国品产一区二区三区有限公司 | 国产小视频在线观看 | 日韩欧美视频一区二区三区 | 亚洲精品久久久久www | 娇喘视频在线观看 | 日韩中文字幕三区 | 亚洲精品一二三区 | 国产精品一区二区三区99 | av电影在线观看免费 |