C C 程式崩潰原因分析

2021-09-28 13:43:37 字數 1441 閱讀 9462

我們執行程式時經常會遇到異常崩潰,也就是我們常說的crash,下面我想總結一下crash出現的原因。而導致crash的主要原因就是段錯誤(segmentation fault)是不是很熟悉,相信每個執行過c程式的小夥伴都見過這兩個單詞,而且這種錯誤一般不給其他提示,看著很糾結。導致段錯誤的原因一般有

1.嘗試訪問我們系統中不存在的記憶體位置

2.試圖在唯讀儲存位置上進行寫操作。

第一種原因就是字面意思,我想也不用解釋了吧,比較常見一種情況是對空指標的讀取操作。我們來看下第二種,舉個小例子:

int

main()

執行上面的**就是報錯:segmentation fault (core dumped)

在**中我們定義了字串常量str,然後我們試圖在字串中加入乙個字母n。我們知道字串在記憶體中是作為常量儲存的,就類似於數字0.1.2…,假設把「crash」看做數字0,n看做1,上面的行為就類似於給數字本身賦值,0 = 1,我們知道這種賦值是非法的。

3.試圖訪問受保護的記憶體位置, 例如核心記憶體

4.記憶體耗盡

4.1 堆疊溢位:發生不終止的記憶體位置遞迴的情況。

#include

void

fun(

int x)

intmain()

4.2 記憶體洩漏:

如果我們通過某個程式動態申請一些記憶體,但是用完後沒有及時釋放。當下次我們再呼叫這個程式時又會申請一次記憶體(請注意因為上一次申請的記憶體沒有釋放,所以我們以為只是使用第二次申請的記憶體,但是系統會認為兩次申請的記憶體我們都在使用,因此第一次申請的記憶體還是處於被占用狀態)多次呼叫程式之後,記憶體就會被耗盡,就會出現動態申請記憶體失敗,程式就會crash。

int

main()

}

5.緩衝區溢位

相信越界這個詞大家都聽過,其中最為常見的就是陣列越界。

#include

intmain()

這種情況會不會crash要看運氣,對,你沒看錯是運氣,誰也無法確定a後面的記憶體是什麼,如果是不可寫的,那你很幸運,它會立刻crash,你可以發現這個問題。如果是可寫的,那你修改了該處的記憶體,造成記憶體破壞,那麼有可能會等一段時間才在別處發生crash,這時候你就會一頭霧水或者改了一些本來正確的部分,它卻還在這裡逍遙法外。

所以處理陣列時一定要格外小心,時刻關注有沒有越界

1.所有陣列遍歷的迴圈,都要加上越界判斷。

2.用下標訪問陣列時,要判斷是否越界。

6.除以零

整數除以零預設的處理方式是終止程序

有點數學常識的都知道整數除以0是不允許的,在計算機中也是,這種情況其實出現的很少,但一旦出現,又很難被發現,所以

在做整數除法時,要判斷被除數是否為0的情況。

QT程式崩潰原因示例和分析

程式崩潰的一般原因 一 記憶體訪問 qt中的qlist和他的了類qbytearraylist,qitemselection,qqueue,qstringlist以下標方式引用時,如果未對下標是由越界進行檢查,就有可能會引起程式的崩潰。1.1 simis teacher createuser.cpp ...

程式崩潰原因總結

測試環境 redhat 程式跑飛原因分析 程式崩潰分析 指標,空指標使用 null 非法指標 0x00000000 棧溢位,strcpy拷貝長字串到區域性變數 格式化串,printf漏寫或多寫變數 堆溢位,malloc會儲存一些控制資料 元資料 在分配給使用者的記憶體塊前 後位置。include i...

程式崩潰的常見原因

常出現程式崩潰的幾種狀況 程式崩潰對於程式猿來說,時經常出現的問題,如果你都沒有出現過,那大佬快收下我的膝蓋吧。程式崩潰一般都發生在執行時期,而崩潰的原因一般都是程式猿的失誤所導致的,在這裡我就總結了這幾種程式崩潰的 讀取未賦值的變數 這個錯誤一般是由於程式猿粗心大意,沒有給變數初始化和賦值,導致該...