段錯誤含義及執行個體

來源:互聯網
上載者:User
百科名片

所謂的段錯誤就是指訪問的記憶體超出了系統所給這個程式的記憶體空間,通常這個值是由gd tr來儲存的,他是一個48位的寄存器,其中的32位是儲存由它指向的
gdt表,後13位儲存 相應於gdt的下標,最後3位包括了程式是否在記憶體中以及程式的在cpu中的運行層級,指向 的gdt是由以64位為一個單位的表,在這張表中就儲存著程式啟動並執行程式碼片段以及資料區段的起
始地址以及與此相應的段限和頁面交換還有程式運行層級還有記憶體粒度等等的資訊。

補充

一旦一個程式發生了越界訪問,cpu就會產生相應的保護,於是segmentation
fault就出現了通過上面的解釋,段錯誤應該就是訪問了不可訪問的記憶體,這個記憶體區要麼是不存在的,要麼是受到系統保護的,還有可能是缺少檔案或者檔案損壞。尋找程式安裝維修按列。在編程中以下幾類做法容易導致段錯誤,基本是是錯誤地使用指標引起的。

1)訪問系統資料區,尤其是往系統保護的記憶體位址寫資料最常見就是給一個指標以0地址。

2)記憶體越界(數組越界,變數類型不一致等):
訪問到不屬於你的記憶體地區。

幾種典型的段錯誤

  1,int main(void){

  char*s ="hello world";

  *s ='H';

  }

  被裝載時,系統把“hello world” 連同其它的字串和const型資料放入到記憶體的唯讀區。執行時,一個變數s被設為指向該字串的位置,當再試圖向該位置寫時,就會產生段錯誤。

  2,

  int*ptr = NULL;

  *ptr =1;

  因為該代碼只建立了一個null 指標,並沒有指向一個具體空間,當賦值時,產生段錯誤。

  3,

  int main(void){

  main();

  return0;

  }

  無限遞迴,這會導致棧溢出,也會產生段錯誤。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.