【Segment Fault】段錯誤解析

今天發現了幾個容易導致段錯誤的代碼;自己分析了一下,分享給大家!

段錯誤是什麼?段錯誤是指訪問的內存超出了系統給這個程序所設定的內存空間,例如訪問了不存在的內存地址、訪問了系統保護的內存地址、訪問了只讀的內存地址等等情況。

訪問不存在的內存地址

#include<stdio.h>
#include<stdlib.h>
void main()
{
        int*ptr = NULL;
        *ptr = 0;
}

因爲操作系統不會把任何數據保存在地址0及其附近,也不會把地址0~0xfff的頁面映射到物理內存,所以任何對地址0的訪問都會立刻導致段錯誤。*p = 0;會導致段錯誤

 

訪問只讀的內存地址

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
        char*ptr = "test";
        strcpy(ptr, "TEST");
}

 

其實,char *ptr ="test"和constchar *ptr = "test" 是一樣的,都是存在敞亮區,處於靜態儲存區,是隻讀的,不可修改的,”test”是固定存在.rdata段的。如果對只讀的進行寫操作,那麼系統就會提示”segmentationfault”

 

棧溢出

棧溢出就是:棧溢出是由於C語言系列沒有內置檢查機制來確保複製到緩衝區的數據不得大於緩衝區的大小,因此當這個數據足夠大的時候,將會溢出緩衝區的範圍。(來自百度百科)

 #include<stdio.h>
#include<stdlib.h>
void main()

       main();
}


無限遞歸。。函數的調用也是有開銷的,棧大小默認就1MB

  所以儘量在編代碼中避免這些常犯的錯誤!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章