[讀] C和指針 (Ch15 ~ Ch18)

Chapter 15

  • (本章介紹I/O,涉及內容多爲各類函數的細節,所以不一一整理)
  • 各不相同但容易混淆的三個概念:express

    • 文件:物理存儲介質上所保存的內容
    • 流:函數庫爲I/O所提供的接口
    • 緩衝:程序對流進行讀寫時所使用的一塊空間(能夠手動指定不要緩衝)
  • 文件和流之間的轉換由操做系統完成,而程序只是經過FILE數據結構來管理儲存流和緩衝區的I/O狀態

Chapter 16

  • 斷言<assert.h>bash

    • 經過斷言某個值爲真來進行測試數據結構

      void assert(int expression); // 斷言expression的值爲真
      • 斷言指針非空:函數

        assert(ptr != NULL);

        若條件不爲真,則終止程序並打印表達式及斷言位置:測試

        > Assertion failed: value != NULL, file.c line 274
    • 能夠經過#define NDEBUG在編譯時忽略全部斷言而不用修改源碼,固然命令行參數-DNDEBUG也有一樣效果

Chapter 17

  • (本章介紹各類數據結構,不一一整理)

Chapter 18

  • (本章介紹C編譯爲彙編的細節,不過已經用ARM學過啦,因此沒有細讀,如下爲簡單的筆記)
  • 靜態變量和它的初始化:編譯器在程序的數據區(.data)爲靜態變量建立空間並初始化
  • 堆棧幀(stack frame)操作系統

    • 堆棧中的一個區域
    • 每一次函數調用都產生一個堆棧幀,用於保存局部變量和其餘值
    • 幀指針指向堆棧幀的起始位置(所以每次函數調用中的幀指針都不一樣,使用link / unlink來切換幀指針)
    • 堆棧幀中的全部值都經過使用幀指針(frame pointer(不是 stack pointer))加上一個offset來訪問
    • 參數:逆序入棧(這樣能夠經過對幀指針加上一個遞增的常數offset來順序訪問參數)
  • 函數(.text區)命令行

    • 函數序(prologue):準備工做指針

      • 爲函數的局部變量保留堆棧中的內存(建立堆棧幀)
    • 函數體(body):code

      • 對變量和函數的單純聲明不會產生指令,但初始化產生對應的賦值命令
    • 函數跋(epilogue):負責在返回前清理堆棧(事實上並不徹底清理,由於只有調用者才知道參數個數)
  • 同一個編譯器產生的程序才能被互相連接
相關文章
相關標籤/搜索