Try   HackMD

重拾 C 語言::其他部分

C Preprocessor

Link

C的內存結構

主要分為四大類:

  • Stack
    主要用來儲存 Function calls 和 Local variables 。
    Stack 的最底層為 main() ,調用函數時執行 push() ,函數 return 時執行 pop()
  • Heap
    當我們使用 malloc, calloc 動態分配記憶體空間時,這些記憶體位置都屬於 Heap 內存。

    如果使用 malloc() 時返回了 null ,代表這一塊空間快要用盡了。

  • Static
    使用 static 關鍵字聲明的變數會被放到該空間。

    補充: static 的用途

  • Code
    存放二進制指令和其他必要文件

#ifdef

Link

多檔開發

使用標頭檔定義方法:

/* File add.h */ #ifdef ADD_H #define ADD_H int add(int, int); #endif

同名.c 實做方法:

/* File add.c */ #include "add.h" int add(int a, int b) { return a + b; }

引用標頭檔直接使用函式:

/* File triple.c */ #include "add.h"; int triple(int x){ return add(x, add(x, x)); }

Struct

typedef struct person_t person_t; struct person_t { char *name; unsigned age; }; int main(void){ person_t p ={ "Ian", 37 }; }

預防寫死

上面範例中的初始化結構方式寫死該結構的屬性的位置,若屬性有更動需一併更動相關程式碼,在軟工觀點上不佳。可以改用以下的方法來初始化結構:

#include <assert.h> struct person_t p = { .name = "Michael", .age = 37 }; assert(pt.x == 3);// 存取結構內屬性 return 0;

補充

typedef struct person_t person_t;

第一個 person_t 為結構名稱,第二個 person_t 為自定義型別名稱:

person_t p ={ "Ian", 37 };

節省記憶體

記憶體對齊