C 程式語言一 · 導覽 read the machine, not the syntax
| 檔案 | 角色 | 放什麼 |
|---|---|---|
| PDF 講義 | 學習主體 | 完整內容、記憶體模型、所有範例 |
| slides(本檔) | 導覽 | 地圖、決策樹、追蹤骨架、bug 分類 |
| index.html | 示範+上手 | 逐步記憶體圖+瀏覽器試跑(JSCPP) |
| 本地練習 | 危險操作 | .c+run.sh,sanitizer 才現形 |
| 測驗卷 | 精熟閘門 | 預測輸出/抓 bug/填空/手寫,90% |
位址(在哪)與值(多少)是兩層;型別決定解參考讀幾 byte、算術一步跨幾 byte。
要解決什麼?
├─ 函式內要改「呼叫端的變數」 ─▶ 傳位址 int *p,用 *p 寫回(swap)
├─ 傳大型資料怕複製成本 ─────▶ 傳指標(只複製一個位址)
├─ 走訪陣列 ─────────────────▶ 指標算術:*(p+i) 等同 a[i]
└─ 大小到執行期才知道 / 要活過函式 ─▶ malloc / free(heap)
└─ 用完一定 free,free 後設 NULL
C 沒有單一公式;用這條流程套每一支程式。
-fsanitize=address,undefined)index.html 把這張做成可逐步操作(配置、寫值、free 後變灰示懸空)
| bug | 症狀 | 成因 | 驗 |
|---|---|---|---|
| 野指標 | 讀到亂值或崩 | 沒初始化就解參考 | 宣告設 NULL |
| 懸空 | 時好時壞 | 用了已回收記憶體 | 本地 04·05 |
| double free | abort | 同塊 free 兩次 | 本地 06 |
| 洩漏 | 越用越多 | malloc 沒對應 free | Instruments |
多屬未定義行為:跑一次沒當 ≠ 沒事,要開 sanitizer。
& 與 * 搞混:&x 是位址、*p 是值scanf("%d", &x) 漏 &sizeof(*p),不是 1 bytesizeof 量到指標大小malloc 沒檢查 NULL 就用./run.sh完整內容 → PDF · 記憶體圖與試跑 → index · 危險操作 → 本地練習 · 複習 → Quizlet / 測驗卷