C語言段錯誤

2021-08-26 18:24:33 字數 1046 閱讀 4914

當我在linux下寫c語言的時候經常會遇到段錯誤.

所以就來細究一下.

段錯誤或段違規(segmentation violation)

檢視expertc 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型變數 這個應該是乙個棧位址 核心已經把它對映到乙個實際的物理頁

你在這個基礎上小幅度上下偏移位址.相應的都應該有實體地址與之對映.

自然沒有問題.

以上都是自己的個人理解.可能還有不足的地方.

C語言段錯誤

當我在linux下寫c語言的時候經常會遇到段錯誤.所以就來細究一下.段錯誤或段違規 segmentation violation 檢視expert c programming peter van der linden pg.156 解釋到段錯誤是由於記憶體管理單元 mmu 的異常所致,而該異常則通常...

c 語言段錯誤

乙個問了我乙個問題,乙個c程式執行出現了段錯誤,這個問題非常好,很多初學者都容易犯這個錯誤,具體 如下 這個編譯沒有問題,但是執行是段錯誤 segmentation fault 因為你定義了乙個結構體指標p,用來指向此類結構體,但是你卻沒有給他賦值,此時p的值為null,你並沒有在記憶體中為p分配任...

c語言 段錯誤 linux

當寫c語言時,經常遇到段錯誤,很多人都是用printf,但是當程式比較大時,就比較難找了,或者當程式執行時並不會立即出現段錯誤,而是經過很長一段時間才會出現那麼用printf顯然不行。這時就可以使用gdb來除錯了 首先檢視區塊數 核心資料轉存core檔案的上限,單位為區塊 詳細檢視ulimit使用 ...