段錯誤理解——蘇嵌實訓第7天

          在今天的編程時,又出現了常見的段錯誤。

 一:段錯誤

         所謂的段錯誤就是指訪問的內存超出了系統所給這個程序的內存空間,通常這個值是由gd tr來保存的,它是一個48位的寄存器,其中的32位是保存由它指向的 gdt表,後13位保存 相應於gdt的下標,最後3位包括了程序是否在內存中以及程序的在cpu中的運行級別,指向 的gdt是由以64位爲一個單位的表,在這張表中就保存着程序運行的代碼段以及數據段的起 始地址以及與此相應的段限和頁面交換還有程序運行級別還有內存粒度等等的信息。

        1. 段錯誤的常見形式:

          1)訪問系統數據區(或錯誤地址,非法地址),尤其是往系統保護的內存地址數據最常見就是給一個指針以0地址。

          2)內存越界(數組越界,變量類型不一致等): 訪問到不屬於你的內存區域。

        2.解決方法:(詳解見百度)

利用gdb逐步查找段錯誤

分析Core文件

利用backtrace和objdump進行分析

二:在編寫程序時,還遇到一些模糊的問題:

    (1)--a與a--。前者是自減後運算,後者是先運算後自減。

     (2)void的用途。
 摘:
1.void的含義 
  void的字面意思是“無類型”,void   *則爲“無類型指針”,void   *可以指向任何類型的數據。 
    void真正發揮的作用在於: 
        (1)對函數返回的限定; 
        (2)對函數參數的限定。 
2.void的使用 
    下面給出void關鍵字的使用規則: 
    規則一:如果函數沒有返回值,那麼應聲明爲void類型 
        在C語言中,凡不加返回值類型限定的函數,就會被編譯器作爲返回整型值處理。但是許多程序員卻誤以爲其爲void類型 
        我們在編寫C/C++程序時,對於任何函數都必須一個不漏地指定其類型。如果函數沒有返回值,一定要聲明爲void類型。這既是程序良好可讀性的需要,也是編程規範性的要求。另外,加上void類型聲明後,也可以發揮代碼的“自注釋”作用。代碼的“自注釋”即代碼能自己註釋自己。 
    規則二:如果函數無參數,那麼應聲明其參數爲void 
    規則三:小心使用void指針類型 
       按照ANSI(American   National   Standards   Institute)標準,不能對void指針進行算法操作 
    規則四:如果函數的參數可以是任意類型指針,那麼應聲明其參數爲void   
    規則五:void不能代表一個真實的變量 

    void體現了一種抽象,這個世界上的變量都是“有類型”的,譬如一個人不是男人就是女人(還有人妖?)。
  void的出現只是爲了一種抽象的需要,如果你正確地理解了面向對象中“抽象基類”的概念,也很容易理解void數據類型。正如不能給抽象基類定義一個實例,我們也不能定義一個void(讓我們類比的稱void爲“抽象數據類型”)變量。 
    

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