c語言段錯誤怎麼解決(c語言常見錯誤總結)
所謂的段錯誤就是指訪問的記憶體超出了系統所給這個程式的記憶體空間。
通常這個值是由gd tr來儲存的,他是一個48位的暫存器,其中的32位是儲存由它指向的 gdt表,後13位儲存 相應於gdt的下標,最後3位包括了程式是否在記憶體中以及程式的在cpu中的執行級別,指向 的gdt是由以64位為一個單位的表,在這張表中就儲存著程式執行的程式碼段以及資料段的起 始地址以及與此相應的段限和頁面交換還有程式執行級別還有記憶體粒度等等的資訊。
幾種典型的段錯誤1,
int main(void){[1]
char*s ="hello world";
*s ='H';
}
被裝載時,系統把“hello world” 連同其它的字串和const型資料放入到記憶體的只讀區。執行時,一個變數s被設為指向該字串的位置,當再試圖向該位置寫時,就會產生段錯誤。
2,
int*ptr = NULL;
*ptr =1;
因為該程式碼只建立了一個空指標,並沒有指向一個具體空間,當賦值時,產生段錯誤。
3,
int main(void){
main();
return0;
}
無限遞迴,這會導致棧溢位,也會產生段錯誤。
利用gdb逐步查詢段錯誤
這種方法也是被大眾所熟知並廣泛採用的方法,首先我們需要一個帶有除錯資訊的可執行程式,所以我們加上“-g -rdynamic"的引數進行編譯,然後用gdb除錯執行這個新編譯的程式,具體步驟如下:
xiaosuo@gentux test $ gcc -g -rdynamic d.c
xiaosuo@gentux test $ gdb ./a.out
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread
(gdb) r
Starting program: /home/xiaosuo/test/a.out
Program received signal SIGSEGV, Segmentation fault.
0x08048524 in dummy_function () at d.c:4
4 *ptr = 0x00;
(gdb)
不用一步步除錯我們就找到了出錯位置d.c檔案的第4行,其實就是如此的簡單。