POINTERS & MEMORY

指標記憶體

C 程式語言一 · 導覽 read the machine, not the syntax

→ / space 前進 Esc 總覽 F 全螢幕
這是導覽:先建地圖。完整內容在 PDF,記憶體圖與試跑在 index。
map · 01

完整包 五件套

檔案角色放什麼
PDF 講義學習主體完整內容、記憶體模型、所有範例
slides(本檔)導覽地圖、決策樹、追蹤骨架、bug 分類
index.html示範+上手逐步記憶體圖+瀏覽器試跑(JSCPP)
本地練習危險操作.crun.sh,sanitizer 才現形
測驗卷精熟閘門預測輸出/抓 bug/填空/手寫,90%
map · 02

一條主線:格子 → 位址 → 指標

變數 x ─▶ 位址 &x ─▶ 指標 int *p = &x ─▶ 解參考 *p ─▶ malloc / free

位址(在哪)與(多少)是兩層;型別決定解參考讀幾 byte、算術一步跨幾 byte。

decide · 03

何時用指標、何時 malloc

要解決什麼?
├─ 函式內要改「呼叫端的變數」 ─▶ 傳位址 int *p,用 *p 寫回(swap)
├─ 傳大型資料怕複製成本 ─────▶ 傳指標(只複製一個位址)
├─ 走訪陣列 ─────────────────▶ 指標算術:*(p+i) 等同 a[i]
└─ 大小到執行期才知道 / 要活過函式 ─▶ malloc / free(heap)
        └─ 用完一定 free,free 後設 NULL
method · 04

通用追蹤骨架

C 沒有單一公式;用這條流程套每一支程式。

  1. 畫記憶體(stack / heap 格子)
  2. 逐行更新值 · 追指標箭頭
  3. 預測輸出
  4. 編譯驗證(危險行為開 -fsanitize=address,undefined
  5. 對照差異 → 分類 bug → 修正
the hero · 05

記憶體圖:stack 指向 heap

堆疊 stack(自動) int *arr 0x9000 堆積 heap(malloc) 010 2030 40 arr[0..4],起始 0x9000 指標在 stack,資料在 heap;free 釋放 heap 那塊,arr 要再設 NULL

index.html 把這張做成可逐步操作(配置、寫值、free 後變灰示懸空)

danger · 06

記憶體 bug 分類

bug症狀成因
野指標讀到亂值或崩沒初始化就解參考宣告設 NULL
懸空時好時壞用了已回收記憶體本地 04·05
double freeabort同塊 free 兩次本地 06
洩漏越用越多malloc 沒對應 freeInstruments

多屬未定義行為:跑一次沒當 ≠ 沒事,要開 sanitizer。

traps · 07

通用易錯速記

  • &* 搞混:&x 是位址、*p 是值
  • scanf("%d", &x)&
  • 指標算術單位是 sizeof(*p),不是 1 byte
  • 陣列傳入函式退化成指標,sizeof 量到指標大小
  • malloc 沒檢查 NULL 就用
go · 08

看完導覽,接著動手

  1. PDF 講義學完整內容與記憶體模型
  2. index.html:看記憶體圖逐步、瀏覽器試跑乖片段
  3. 危險操作到 本地練習 ./run.sh
  4. Quizlet 主動回憶 → 測驗卷 ≥ 90% 過 否則回頭
FESTINA LENTE

導覽結束

完整內容 → PDF · 記憶體圖與試跑 → index · 危險操作 → 本地練習 · 複習 → Quizlet / 測驗卷