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

首頁 > 編程 > C > 正文

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

2020-02-24 14:32:31
字體:
供稿:網(wǎng)友

不知道大伙是不是跟武林小編一樣,當我在linux下寫c語言的時候經(jīng)常會遇到段錯誤,為此,今天我們就來仔細研究一下,給出C語言中段錯誤的問題處理。

?
段錯誤或段違規(guī)(segmentation violation)
查看Expert C Programming(Peter Van Der Linden) Pg.156
解釋到段錯誤是由于內(nèi)存管理單元(MMU)的異常所致,
而該異常則通常是由于解除引用一個未初始化或非法的指針引起.

就是指針正在引用一個并不位于你的地址空間中的地址.
書中的例子

?

int *p = 0;?
*p = 17;?


這里顯然 地址0 并不是你程序所在的地址空間 所能得到的
而我在試驗的時候 幾乎隨便給個地址 都是段錯誤
這也很正常,在運行之前是很難知道系統(tǒng)給你分配的地址空間的.
?
于是我這樣測試了一下

?

?

?


int *p = 0;?
?int a = 7;?

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

?printf("%d",*p);


由于 變量a的地址肯定在系統(tǒng)給你的程序所分配的地址空間內(nèi)
所以你按照a的地址 給p賦值
或者小數(shù)目的向上下移4的整數(shù)倍 都是沒問題的
經(jīng)測試 并無段錯誤

分析了一下原因
在linux中,當你malloc一段內(nèi)存的時候 只是拿到了 這段內(nèi)存的虛擬地址.而這段虛擬地址也名沒有實質(zhì)的映射到物理地址.
而只有當你使用這段內(nèi)存的時候.系統(tǒng)會申請相應(yīng)頁表映射到相應(yīng)的物理地址.
而*p直接隨意指向一個虛擬地址? 而這個虛擬地址并沒有實際的物理地址與之映射.
這時候解引用會在MMU發(fā)出異常,返回到linux就會給用戶報一個段錯誤.
而如果你定義1個int型變量 這個應(yīng)該是一個棧地址 內(nèi)核已經(jīng)把它映射到一個實際的物理頁
你在這個基礎(chǔ)上小幅度上下偏移地址.相應(yīng)的都應(yīng)該有物理地址與之映射.
自然沒有問題.

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

?

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

圖片精選

主站蜘蛛池模板: 紫金县| 淳安县| 枣庄市| 安西县| 陇川县| 和平县| 古浪县| 漳平市| 永清县| 河北省| 观塘区| 漯河市| 买车| 偃师市| 井陉县| 泾川县| 万源市| 齐齐哈尔市| 枞阳县| 保靖县| 华亭县| 祁门县| 蛟河市| 城市| 伊春市| 上林县| 龙游县| 卢龙县| 齐齐哈尔市| 锡林浩特市| 衡阳市| 文山县| 淅川县| 内丘县| 晋中市| 东乌| 江北区| 武义县| 措勤县| 昌乐县| 甘德县|