程式在記憶體裡怎麼跑:位址、stack、heap 與返回位址
程式載入記憶體後,CPU 靠一個記錄「現在跑到哪」的位址一條條往下執行;呼叫函式時,stack 會留下一張寫著「做完回哪裡」的返回位址。用一支小 C 程式印出位址,就能自己驗證。
程式載入記憶體後,CPU 靠一個記錄「現在跑到哪」的位址一條條往下執行;呼叫函式時,stack 會留下一張寫著「做完回哪裡」的返回位址。用一支小 C 程式印出位址,就能自己驗證。
緩衝區溢位是資料寫過了預留空間的邊界,蓋到隔壁的東西。教學範例裡,名字多寫一個字元就讓 is_admin 從 0 變成 65;修法是檢查長度並改用限制長度的函式。canary、ASLR、NX 是補強而不是保證,AddressSanitizer 能抓到獨立陣列的溢位,但我實測抓不到同一個 struct 內的欄位溢位。
第四講先釐清 signed/unsigned 轉型不改 bits、混合比較可能改變數值意義,以及 sign extension、zero extension、truncation;再推導 AND、OR、NOT、XOR 與 bitmask 的讀取、設定、清除和集合操作。
第三講從 32/64-bit 位址空間出發,推導 unsigned 與 two's-complement signed integer 的範圍、反相加一與共用加法硬體,再分清 unsigned modulo 運算和 C signed overflow,最後用四組故障案例檢查模型。
第五講把 bitmask 推進到 left/right shift、power-of-two 與 popcount tricks,並用 absolute-value 範例揭示 signed intermediate 在 INT_MIN 會 overflow;後半建立 GDB 的 breakpoint、執行控制、格式化 print、memory examine 與 backtrace 工作流。
第二講把 C 放回 Unix 的歷史與開發環境:拆解 header、main、printf、argc/argv,走過 ssh、emacs、make 與執行檔,再用位值系統推導 8 bits = 1 byte、byte 的 256 種 pattern,以及 binary/hexadecimal 的雙向換算。
Winter 2026 第一講先回答 CS107 為何要往抽象層底下挖:從位元組、記憶體、組合語言到 heap allocator,再交代作業 40%、lab 10%、期中 20%、期末 30% 的課程制度,最後用 Unix 命令列替後續 C 開發暖身。
CS107 第 7 講先用 strchr、strstr、strspn 建立指標式字串掃描,再指出只驗證內容仍擋不住 buffer overflow:安全邊界必須同時涵蓋輸入規則、目的地容量、終止字元與記憶體檢測。
CS107 第 6 講把 C 字串拆回 char 陣列、終止空字元與位址:strlen、strcmp、strcpy、strncpy、strcat 的每一個便利,都以呼叫者維持容量與終止條件為代價。
CS107 第 12 講先用 char * 完成 byte-wise generic swap 與 rotate,再以 function pointer 把 bubble sort 的走訪機制和比較規則拆開;void * 解決資料型別,callback 解決行為差異。
CS107 第 13 講把 bool callback 升級成三向 comparator,再把 void *、element width 與 const void * callback 合併成完整 generic bubble sort,最後對照 qsort、bsearch、lfind 與 lsearch。
CS107 第 11 講先收完 calloc、strdup、free、realloc 的 heap 契約,再把 swap 從多份型別專用程式改造成 void * 加 byte count:C 的泛型不是保留未知型別,而是明確交接位址、寬度與解讀責任。
CS107 第 8 講從 & 取址與 * 解參照出發,說清楚 C 的 pointer parameter 為何仍是 pass-by-value,以及 int *、char *、char ** 如何分別修改 caller 擁有的 int、char 與 pointer。
CS107 第 9 講用 C strings 七條規則拆開 array object、pointer variable 與 string literal:array 常在運算式中退化成首元素指標,但儲存空間、可重新賦值性、可修改性與 sizeof 行為仍完全不同。
CS107 第 10 講從 sizeof 與 pointer arithmetic 走進 stack frame lifetime:回傳 local array 會留下 dangling pointer;malloc 讓資料跨越函式返回,但也把 NULL、容量計算、ownership、free 與 memory leak 交給程式設計者。
CS107 是 Stanford 的計算機系統課:從位元、C 字串與指標,走到 x86-64 組合語言與執行期堆疊,最後自己寫 heap allocator,共七份作業。講義、作業說明與 lab 的逐題解答都公開;作業起始碼放在 Stanford 的 AFS 上,沒有校內帳號拿不到。
CS111 是 Stanford 的作業系統原理課,分並行、記憶體管理、檔案系統三塊,共九份作業。28 份講義、九份作業說明與三年附解答的期中期末考題都公開;起始碼要能登入校內的 myth 機器,錄影在 Canvas。