国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

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

2020-01-26 16:13:50
字體:
來源:轉載
供稿:網友

當我在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型變量 這個應該是一個棧地址 內核已經把它映射到一個實際的物理頁
你在這個基礎上小幅度上下偏移地址.相應的都應該有物理地址與之映射.
自然沒有問題.

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

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

圖片精選

主站蜘蛛池模板: 万源市| 筠连县| 高碑店市| 庆安县| 东宁县| 阿坝县| 秀山| 平乡县| 图们市| 澄迈县| 额敏县| 罗定市| 化州市| 利辛县| 突泉县| 上高县| 嘉黎县| 江津市| 门头沟区| 班戈县| 孙吴县| 集贤县| 兰考县| 凤城市| 班玛县| 德庆县| 浙江省| 报价| 太白县| 茂名市| 海南省| 松阳县| 大石桥市| 太原市| 五河县| 平遥县| 南安市| 潜江市| 壶关县| 水城县| 盱眙县|