Skip to content
所有標籤

#c-language

17 篇文章

程式在記憶體裡怎麼跑:位址、stack、heap 與返回位址

程式載入記憶體後,CPU 靠一個記錄「現在跑到哪」的位址一條條往下執行;呼叫函式時,stack 會留下一張寫著「做完回哪裡」的返回位址。用一支小 C 程式印出位址,就能自己驗證。

多寫幾個字元,為什麼可能讓別人控制程式:緩衝區溢位入門

緩衝區溢位是資料寫過了預留空間的邊界,蓋到隔壁的東西。教學範例裡,名字多寫一個字元就讓 is_admin 從 0 變成 65;修法是檢查長度並改用限制長度的函式。canary、ASLR、NX 是補強而不是保證,AddressSanitizer 能抓到獨立陣列的溢位,但我實測抓不到同一個 struct 內的欄位溢位。

Bitwise operators、型別轉換與 bitmask|Stanford CS107 第 4 堂

第四講先釐清 signed/unsigned 轉型不改 bits、混合比較可能改變數值意義,以及 sign extension、zero extension、truncation;再推導 AND、OR、NOT、XOR 與 bitmask 的讀取、設定、清除和集合操作。

整數、位元組與 two's complement|Stanford CS107 第 3 堂

第三講從 32/64-bit 位址空間出發,推導 unsigned 與 two's-complement signed integer 的範圍、反相加一與共用加法硬體,再分清 unsigned modulo 運算和 C signed overflow,最後用四組故障案例檢查模型。

Bit shifts、bit tricks 與 GDB|Stanford CS107 第 5 堂

第五講把 bitmask 推進到 left/right shift、power-of-two 與 popcount tricks,並用 absolute-value 範例揭示 signed intermediate 在 INT_MIN 會 overflow;後半建立 GDB 的 breakpoint、執行控制、格式化 print、memory examine 與 backtrace 工作流。

第一支 C 程式,以及 binary 與 hexadecimal|Stanford CS107 第 2 堂

第二講把 C 放回 Unix 的歷史與開發環境:拆解 header、main、printf、argc/argv,走過 ssh、emacs、make 與執行檔,再用位值系統推導 8 bits = 1 byte、byte 的 256 種 pattern,以及 binary/hexadecimal 的雙向換算。

從課程地圖走進 Unix 命令列|Stanford CS107 第 1 堂

Winter 2026 第一講先回答 CS107 為何要往抽象層底下挖:從位元組、記憶體、組合語言到 heap allocator,再交代作業 40%、lab 10%、期中 20%、期末 30% 的課程制度,最後用 Unix 命令列替後續 C 開發暖身。

從字串搜尋到 Buffer Overflow,輸入驗證不是容量檢查|Stanford CS107 第 7 堂

CS107 第 7 講先用 strchr、strstr、strspn 建立指標式字串掃描,再指出只驗證內容仍擋不住 buffer overflow:安全邊界必須同時涵蓋輸入規則、目的地容量、終止字元與記憶體檢測。

C 字串不是型別,而是一份記憶體契約|Stanford CS107 第 6 堂

CS107 第 6 講把 C 字串拆回 char 陣列、終止空字元與位址:strlen、strcmp、strcpy、strncpy、strcat 的每一個便利,都以呼叫者維持容量與終止條件為代價。

Function Pointer 讓 Generic C 注入比較規則|Stanford CS107 第 12 堂

CS107 第 12 講先用 char * 完成 byte-wise generic swap 與 rotate,再以 function pointer 把 bubble sort 的走訪機制和比較規則拆開;void * 解決資料型別,callback 解決行為差異。

從 Comparator 到完整 Generic Bubble Sort|Stanford CS107 第 13 堂

CS107 第 13 講把 bool callback 升級成三向 comparator,再把 void *、element width 與 const void * callback 合併成完整 generic bubble sort,最後對照 qsort、bsearch、lfind 與 lsearch。

void * 如何讓 C 擁有泛型,又不假裝型別還在|Stanford CS107 第 11 堂

CS107 第 11 講先收完 calloc、strdup、free、realloc 的 heap 契約,再把 swap 從多份型別專用程式改造成 void * 加 byte count:C 的泛型不是保留未知型別,而是明確交接位址、寬度與解讀責任。

指標不是魔法,而是可被複製的位址|Stanford CS107 第 8 堂

CS107 第 8 講從 & 取址與 * 解參照出發,說清楚 C 的 pointer parameter 為何仍是 pass-by-value,以及 int *、char *、char ** 如何分別修改 caller 擁有的 int、char 與 pointer。

Array 不是 Pointer,但它們在運算式裡合作|Stanford CS107 第 9 堂

CS107 第 9 講用 C strings 七條規則拆開 array object、pointer variable 與 string literal:array 常在運算式中退化成首元素指標,但儲存空間、可重新賦值性、可修改性與 sizeof 行為仍完全不同。

Stack 與 Heap 的差別不是速度,而是 Lifetime 與 Ownership|Stanford CS107 第 10 堂

CS107 第 10 講從 sizeof 與 pointer arithmetic 走進 stack frame lifetime:回傳 local array 會留下 dangling pointer;malloc 讓資料跨越函式返回,但也把 NULL、容量計算、ownership、free 與 memory leak 交給程式設計者。

計算機組織與系統:從 C 與指標到 x86-64 與自己寫 malloc|Stanford CS107 課程總覽

CS107 是 Stanford 的計算機系統課:從位元、C 字串與指標,走到 x86-64 組合語言與執行期堆疊,最後自己寫 heap allocator,共七份作業。講義、作業說明與 lab 的逐題解答都公開;作業起始碼放在 Stanford 的 AFS 上,沒有校內帳號拿不到。

作業系統原理:從執行緒、虛擬記憶體到檔案系統|Stanford CS111 課程總覽

CS111 是 Stanford 的作業系統原理課,分並行、記憶體管理、檔案系統三塊,共九份作業。28 份講義、九份作業說明與三年附解答的期中期末考題都公開;起始碼要能登入校內的 myth 機器,錄影在 Canvas。