Mục lục khóa học
Khóa học gồm 22 phần và 59 chương, chia theo 8 cấp độ. Các phần chưa mở sẽ được bổ sung dần. Bạn nên học tuần tự vì mỗi phần đều dựa trên phần trước.
Làm quen với lập trình và ngôn ngữ C
Hiểu C là gì, cài được môi trường, biết chương trình biến thành file chạy như thế nào, và viết được chương trình đầu tiên.
Chương 1. C là gì?
Lịch sử, vị trí của C trong hệ thống phần mềm, môi trường làm việc, và toàn bộ đường đi từ mã nguồn tới file chạy được.
- 1.1Tổng quan về CC ra đời thế nào, dùng ở đâu, mạnh yếu ra sao, và vì sao sau hơn 50 năm nó vẫn chưa bị thay thế.14 phút
- 1.2Cài đặt môi trườngChọn và cài trình biên dịch, editor, công cụ gỡ lỗi trên Linux, WSL, macOS hoặc Windows.12 phút
- 1.3Quy trình biên dịchBốn giai đoạn tiền xử lý, biên dịch, hợp dịch, liên kết. Chạy tay từng bước và đọc kết quả trung gian.20 phút
- 1.4Chương trình C đầu tiênMổ xẻ Hello World từng thành phần, và chứng minh main không phải điểm bắt đầu thật sự.16 phút
Cơ sở ngôn ngữ
Nắm cú pháp cơ bản, kiểu dữ liệu, nhập xuất, toán tử và rẽ nhánh.
Chương 2. Cú pháp cơ bản
Cấu trúc chương trình, biến, kiểu dữ liệu, sizeof, hằng số.
- 2.1Cấu trúc chương trình CNăm thành phần của một file nguồn, phân biệt câu lệnh với khối lệnh, và luật dấu chấm phẩy.13 phút
- 2.2BiếnBiến là một ô nhớ có tên. Khai báo, khởi tạo, gán, phạm vi và thời gian sống.15 phút
- 2.3Kiểu dữ liệuKích thước, miền giá trị, vì sao chuẩn C không cố định kích thước, tràn số và bẫy số thực.24 phút
- 2.4sizeofToán tử tính lúc biên dịch, in bằng %zu, và bẫy sizeof trên tham số mảng.13 phút
- 2.5Hằng sốSo sánh define, const và enum. Đọc const với con trỏ, và ba cạm bẫy của macro.15 phút
Chương 3. Input / Output
printf, xâu định dạng, scanf, fgets và các lỗi nhập liệu thường gặp.
- 3.1printfGiá trị trả về, escape sequence, và cơ chế đệm quyết định khi nào chữ hiện ra màn hình.15 phút
- 3.2Format specifierGiải phẫu đầy đủ năm thành phần của một đặc tả định dạng, kèm lỗ hổng chuỗi định dạng.28 phút
- 3.3scanfGiá trị trả về, giới hạn độ rộng, khoảng trắng trong chuỗi định dạng và tập ký tự.19 phút
- 3.4Nhập chuỗi bằng fgetsCách nhập an toàn được dùng suốt khóa học, kèm hàm nhập số nguyên hoàn chỉnh.17 phút
- 3.5Các lỗi nhập liệu thường gặpNăm lỗi khiến chương trình bỏ qua lượt nhập, treo vô hạn, hoặc bị tràn bộ đệm.17 phút
Chương 4. Toán tử
Số học, so sánh, logic, gán, tăng giảm và độ ưu tiên.
- 4.1Toán tử số họcBẫy chia số nguyên, dấu của phép lấy dư, chia cho 0, và các ứng dụng của toán tử %.15 phút
- 4.2Toán tử so sánhKết quả so sánh là số nguyên, và năm lỗi so sánh kinh điển của người mới học C.15 phút
- 4.3Toán tử logicQuy tắc chân lý trong C, đánh giá ngắn mạch, và phân biệt toán tử logic với toán tử bit.13 phút
- 4.4Toán tử gánCác dạng gán rút gọn, phép gán là biểu thức, và bẫy ép kiểu ngầm.11 phút
- 4.5Tăng và giảmPhân biệt tiền tố với hậu tố, và những biểu thức tuyệt đối không được viết.13 phút
- 4.6Độ ưu tiên toán tửBảng độ ưu tiên đầy đủ và năm bẫy khiến biểu thức chạy khác hoàn toàn ý định.17 phút
Chương 5. Cấu trúc điều khiển
if, else if, switch, break, continue, toán tử ba ngôi.
- 5.1Câu lệnh ifĐiều kiện trong C là một con số, và bài học từ lỗi bảo mật goto fail của Apple.12 phút
- 5.2if và elseRẽ hai nhánh, và bẫy else lơ lửng khi bỏ ngoặc nhọn ở if lồng nhau.11 phút
- 5.3else ifChuỗi nhiều nhánh loại trừ nhau, và vì sao thứ tự điều kiện quyết định tính đúng sai.12 phút
- 5.4if lồng nhauKhi nào cần lồng, và kỹ thuật guard clause để làm phẳng mã nguồn.13 phút
- 5.5switchNăm ràng buộc bắt buộc nhớ, fallthrough có chủ ý và vô ý, và bảng nhảy.19 phút
- 5.6breakThoát switch và thoát vòng lặp, và vì sao break chỉ thoát được một tầng.11 phút
- 5.7continueBỏ qua phần còn lại của lượt lặp, và bẫy vòng lặp vô hạn khi dùng trong while.11 phút
- 5.8Toán tử ba ngôiToán tử duy nhất của C có ba toán hạng. Khi nào nên dùng và khi nào không.11 phút
Vòng lặp và tư duy thuật toán
Thành thạo ba loại vòng lặp và biết cách nghĩ ra thuật toán trước khi viết code.
Chương 6. Loop
while, do while, for, vòng lặp lồng nhau, điều khiển vòng lặp.
- 6.1whileVòng lặp kiểm tra điều kiện trước, ba thành phần bắt buộc, và ba nguyên nhân chạy vô hạn.15 phút
- 6.2do whileVòng lặp kiểm tra điều kiện sau, chạy ít nhất một lần, và hai ứng dụng chính.12 phút
- 6.3forBa phần trong ngoặc, các biến thể, khai báo biến trong for, và bẫy size_t đếm ngược.18 phút
- 6.4Vòng lặp lồng nhauQuan hệ hàng và cột, độ phức tạp nhân lên, và vì sao thứ tự duyệt quyết định tốc độ.17 phút
- 6.5Điều khiển vòng lặpbreak, continue, goto và return trong vòng lặp, cùng cách thoát nhiều tầng.14 phút
- 6.6Vòng lặp vô hạnBa cách viết, các ứng dụng hợp lệ, và cách chẩn đoán khi vô hạn ngoài ý muốn.13 phút
Chương 7. Tư duy giải thuật
Quy trình giải bài toán, mã giả, lưu đồ, độ phức tạp Big-O.
- 7.1Quy trình giải bài toánSáu bước từ lúc đọc đề tới lúc có chương trình chạy đúng, kèm ví dụ áp dụng đầy đủ.18 phút
- 7.2Thuật toánNăm tính chất bắt buộc, và vì sao cùng một bài toán có thể chênh nhau hàng vạn lần.16 phút
- 7.3Mã giảCách mô tả thuật toán không phụ thuộc ngôn ngữ, và quy ước dùng trong khóa học.14 phút
- 7.4Lưu đồSáu ký hiệu chuẩn, cách vẽ ba cấu trúc cơ bản, và giới hạn của lưu đồ.14 phút
- 7.5Độ phức tạpBig-O, cách đếm nhanh từ vòng lặp, quy đổi ra thời gian thật, và độ phức tạp không gian.22 phút
- 7.6Phân tích một bài toánMô hình vào xử lý ra, bảng phân tích bắt buộc, và năm câu hỏi trước khi viết code.17 phút
Hàm
Chia chương trình thành hàm, hiểu khung ngăn xếp, nắm đệ quy.
Chương 8. Function
Khai báo, định nghĩa, tham số, giá trị trả về, phạm vi, static, đệ quy.
- 8.1Khái niệm hàmVì sao cần hàm, sáu lợi ích cụ thể, và sáu nguyên tắc thiết kế một hàm tốt.14 phút
- 8.2Khai báo hàmNguyên mẫu hàm, vì sao trình biên dịch cần nó, và ba cách đặt nguyên mẫu.14 phút
- 8.3Định nghĩa hàmBốn thành phần của một định nghĩa, quy tắc một định nghĩa, và hàm inline.15 phút
- 8.4Lời gọi hàm và khung ngăn xếpĐiều gì thật sự xảy ra khi gọi một hàm, và cách nhìn thấy khung ngăn xếp bằng gdb.22 phút
- 8.5Tham sốTham số hình thức và đối số thực tế, truyền mảng, và khi nào nên gom vào struct.16 phút
- 8.6Giá trị trả vềBa cách trả về nhiều giá trị, ba quy ước báo lỗi, và bẫy thiếu return.18 phút
- 8.7Truyền theo giá trịC luôn truyền bản sao. Vì sao swap cần con trỏ, và vì sao mảng trông như ngoại lệ.18 phút
- 8.8Phạm vi biếnBiến cục bộ, biến toàn cục, che khuất biến, và vì sao nên tránh biến toàn cục.16 phút
- 8.9staticMột từ khóa hai nghĩa hoàn toàn khác nhau, và bảng tổng hợp năm lớp lưu trữ.17 phút
- 8.10Đệ quyHai thành phần bắt buộc, chạy tay ngăn xếp đệ quy, chi phí thật, và khi nào không nên dùng.24 phút
Array và String
Thành thạo mảng một và hai chiều, hiểu chuỗi C là mảng ký tự kết thúc bằng ký tự null.
Chương 9. Mảng một chiều
Khai báo, duyệt, tìm kiếm, min max, sắp xếp cơ bản.
- 9.1Mảng là gìBố cục bộ nhớ, công thức địa chỉ, và lý do C không kiểm tra biên mảng.18 phút
- 9.2Khởi tạo mảngSáu cách khởi tạo, khởi tạo có chỉ định của C99, và vì sao không gán mảng bằng dấu bằng.17 phút
- 9.3Truy cập phần tửBốn cách viết tương đương, công thức địa chỉ, và bẫy chỉ số có dấu.15 phút
- 9.4Duyệt mảngBa cách duyệt, macro đếm phần tử và giới hạn của nó, cùng cách in mảng gọn gàng.16 phút
- 9.5Tìm kiếmTìm tuyến tính, tìm nhị phân, bẫy tràn khi tính điểm giữa, và bsearch của thư viện chuẩn.22 phút
- 9.6Tìm giá trị nhỏ nhất và lớn nhấtCách khởi tạo đúng, trả về cả vị trí, và thuật toán tìm cả hai bằng ít phép so sánh hơn.16 phút
- 9.7Tổng và trung bìnhHai cái bẫy tràn số và chia nguyên, cùng sai số cộng dồn với số thực.17 phút
- 9.8Sắp xếp cơ bảnBa thuật toán sắp xếp O(n bình phương), tính ổn định, và bài đo thời gian thực tế.28 phút
Chương 10. Mảng hai chiều
Ma trận, cộng, nhân, chuyển vị, đường chéo.
- 10.1Ma trậnKhai báo, bố cục theo hàng, vì sao chiều thứ hai bắt buộc phải ghi.18 phút
- 10.2Nhập và xuất ma trậnVòng lặp lồng chuẩn, căn cột khi in, và cách kiểm tra dữ liệu vào.15 phút
- 10.3Cộng và trừ ma trậnPhép toán theo từng phần tử, điều kiện kích thước, và cách viết hàm dùng lại được.14 phút
- 10.4Nhân ma trậnBa vòng lặp lồng nhau, độ phức tạp lập phương, và thứ tự vòng lặp quyết định tốc độ.24 phút
- 10.5Chuyển vịChuyển vị ra mảng mới và chuyển vị tại chỗ cho ma trận vuông.14 phút
- 10.6Đường chéo và tam giácHai đường chéo, ba vùng tam giác, và điều kiện chỉ số của từng vùng.15 phút
Chương 11. String
Ký tự kết thúc chuỗi, thư viện string.h và tự cài lại các hàm.
- 11.1Chuỗi trong CChuỗi là mảng ký tự, khác biệt giữa mảng ghi được và hằng chuỗi chỉ đọc.18 phút
- 11.2Ký tự kết thúc chuỗiVì sao mọi hàm chuỗi đều phụ thuộc vào một byte 0, và chuyện gì xảy ra khi thiếu nó.18 phút
- 11.3Nhập chuỗiVì sao gets bị xóa khỏi chuẩn, cách dùng fgets đúng, và xử lý ký tự xuống dòng.20 phút
- 11.4strlenĐếm ký tự trước byte 0, chi phí tuyến tính, và bẫy gọi strlen trong điều kiện vòng lặp.15 phút
- 11.5strcpySao chép chuỗi, vì sao strcpy nguy hiểm, và cách dùng snprintf thay thế.18 phút
- 11.6strcatNối chuỗi, chi phí bậc hai khi nối trong vòng lặp, và cách nối hiệu quả.17 phút
- 11.7strcmpSo sánh theo thứ tự từ điển, ý nghĩa dấu của kết quả, và bẫy so sánh chuỗi bằng dấu bằng.16 phút
- 11.8strchrTìm ký tự trong chuỗi, chiều tìm ngược, và cách tách chuỗi bằng con trỏ.15 phút
- 11.9strstrTìm chuỗi con, độ phức tạp thực tế, và cách thay thế mọi lần xuất hiện.18 phút
- 11.10Tự cài lại thư viện chuỗiCài lại tám hàm của string.h, kèm bộ kiểm thử tự động so với bản chuẩn.26 phút
Pointer
Bước chuyển quan trọng nhất của C. Hiểu bộ nhớ, địa chỉ, con trỏ và con trỏ hàm.
Chương 12. Pointer cơ bản
Bộ nhớ, địa chỉ, giải tham chiếu, con trỏ với hàm và mảng.
- 12.1Bộ nhớ, địa chỉ và giá trịMô hình bộ nhớ phẳng, mỗi byte một địa chỉ, và vì sao con trỏ là khái niệm tất yếu.18 phút
- 12.2Toán tử lấy địa chỉToán tử và, kiểu của kết quả, và những thứ không lấy địa chỉ được.15 phút
- 12.3Con trỏKhai báo, khởi tạo, con trỏ rỗng, con trỏ hoang, và vì sao kiểu con trỏ quan trọng.22 phút
- 12.4Giải tham chiếuToán tử sao, đọc và ghi qua con trỏ, và bốn cách giải tham chiếu sai.20 phút
- 12.5Con trỏ và hàmTruyền con trỏ vào hàm, trả về con trỏ, và quy tắc vàng về vòng đời.18 phút
- 12.6Mô phỏng truyền tham chiếuBa mẫu dùng con trỏ để hàm ghi ra ngoài, và cách kiểm tra tham số con trỏ.18 phút
- 12.7Con trỏ và mảngPhân rã mảng, bốn cách viết tương đương, và ba chỗ mảng không phân rã.20 phút
- 12.8Số học con trỏCộng trừ con trỏ đếm theo phần tử, hiệu hai con trỏ, và giới hạn của chuẩn.20 phút
Chương 13. Pointer nâng cao
Con trỏ tới con trỏ, mảng con trỏ, con trỏ hàm, callback, void*, const.
- 13.1Con trỏ tới con trỏHai tầng gián tiếp, khi nào cần, và cách đọc khai báo nhiều dấu sao.20 phút
- 13.2Con trỏ và chuỗiDuyệt chuỗi bằng con trỏ, cắt chuỗi không sao chép, và mẫu quét chuỗi.18 phút
- 13.3Mảng con trỏMảng chuỗi kiểu ragged, đối số dòng lệnh, và so sánh với mảng hai chiều.20 phút
- 13.4Con trỏ tới mảngPhân biệt con trỏ tới mảng với mảng con trỏ, và quy tắc đọc khai báo từ trong ra.18 phút
- 13.5Con trỏ hàmLưu địa chỉ hàm, gọi qua con trỏ, và bảng điều phối thay cho chuỗi if.22 phút
- 13.6Hàm gọi lạiĐảo ngược quyền điều khiển, qsort và bsearch, và mẫu truyền ngữ cảnh.20 phút
- 13.7Con trỏ voidCon trỏ không kiểu, lập trình tổng quát, và những giới hạn phải nhớ.18 phút
- 13.8const với con trỏBốn tổ hợp const, quy tắc đọc từ phải sang trái, và cách chọn đúng.18 phút
Memory Management
Hiểu bản đồ bộ nhớ tiến trình, dùng đúng malloc và free, nhận diện bốn loại lỗi bộ nhớ.
Chương 14. Bộ nhớ
Stack, heap, vùng tĩnh, malloc, calloc, realloc, free và các lỗi kinh điển.
- 14.1Ngăn xếpCách ngăn xếp cấp và thu hồi bộ nhớ, giới hạn kích thước, và ba cách làm tràn nó.18 phút
- 14.2Vùng cấp phát độngVì sao cần heap, nó khác ngăn xếp ở đâu, và bộ cấp phát làm việc thế nào.20 phút
- 14.3Bộ nhớ tĩnhVùng .data và .bss, biến static trong hàm, và thứ tự khởi tạo trước khi main chạy.16 phút
- 14.4Bộ nhớ toàn cụcBiến toàn cục nằm ở đâu, liên kết ngoài và nội bộ, và định nghĩa dự phòng.16 phút
- 14.5Bản đồ bộ nhớSáu vùng của một tiến trình, cách xem chúng thật, và đọc địa chỉ để đoán loại lỗi.20 phút
- 14.6mallocCấp phát vùng nhớ lúc chạy, cách viết đúng, và bốn lỗi kinh điển khi gọi nó.22 phút
- 14.7callocCấp phát và xóa về 0 trong một bước, kiểm tra tràn tự động, và khi nào nên dùng.15 phút
- 14.8reallocĐổi kích thước vùng đã cấp, cái bẫy mất con trỏ, và mẫu mảng tự lớn.22 phút
- 14.9freeTrả bộ nhớ về hệ thống, các quy tắc bắt buộc, và vì sao free không xóa dữ liệu.18 phút
- 14.10Rò rỉ bộ nhớBốn nguyên nhân rò rỉ, cách phát hiện bằng công cụ, và bốn mẫu phòng tránh.22 phút
- 14.11Con trỏ treoBa cách tạo ra con trỏ treo, vì sao nó khó phát hiện, và cách phòng.18 phút
- 14.12Giải phóng hai lầnVì sao gọi free hai lần phá cấu trúc bên trong bộ cấp phát, và cách phòng tuyệt đối.16 phút
- 14.13Dùng sau khi giải phóngLoại lỗi bộ nhớ nguy hiểm nhất, cơ chế khai thác, và bộ công cụ phát hiện.20 phút
Struct / Union / Enum
Gom dữ liệu thành kiểu mới, hiểu padding và alignment.
Chương 15. Struct
Khai báo, typedef, con trỏ struct, struct lồng nhau, cấp phát động.
- 15.1Struct cơ bảnGom nhiều kiểu vào một, ba cách khởi tạo, và bố cục bộ nhớ kèm phần đệm.24 phút
- 15.2typedefĐặt tên mới cho kiểu, bốn cách kết hợp với struct, và khi nào không nên dùng.16 phút
- 15.3Con trỏ structToán tử mũi tên, truyền struct hiệu quả, và kiểu không hoàn chỉnh để giấu chi tiết.20 phút
- 15.4Struct lồng nhauStruct chứa struct, thành viên vô danh của C11, và bố cục bộ nhớ khi lồng.18 phút
- 15.5Mảng structDanh sách bản ghi, sắp xếp và tìm kiếm, cùng so sánh hai cách bố trí dữ liệu.20 phút
- 15.6Struct và hàmTruyền và trả về struct, quy ước gọi hàm, và mẫu thiết kế giao diện quanh struct.20 phút
- 15.7Struct và cấp phát độngCặp hàm tạo và hủy, sao chép nông so với sao chép sâu, và mảng thành viên linh hoạt.24 phút
Chương 16. Enum
Hằng số có tên, kết hợp switch, máy trạng thái.
- 16.1Enum cơ bảnHằng số có tên, quy tắc đánh số, kiểu thật của enum và những giới hạn của nó.18 phút
- 16.2enum với switchVì sao không viết nhánh mặc định, và cách để trình biên dịch bắt lỗi thiếu nhánh.16 phút
- 16.3Máy trạng tháiBảng chuyển trạng thái thay cho hàng chục nhánh if, và cách kiểm chứng nó.22 phút
Chương 17. Union
Chia sẻ vùng nhớ, tagged union, ứng dụng trong hệ nhúng.
- 17.1Union cơ bảnMọi thành viên dùng chung một vùng nhớ, kích thước, và quy tắc chỉ đọc thành viên vừa ghi.18 phút
- 17.2Union có nhãnGhép enum với union thành kiểu biến thể an toàn, và bộ hàm thao tác quanh nó.22 phút
- 17.3Ứng dụng thực tếĐọc dữ liệu theo byte, gói tin mạng, thanh ghi phần cứng, và giới hạn về tính di động.20 phút
File và dữ liệu
Đọc ghi file văn bản và nhị phân, làm được ứng dụng có dữ liệu bền vững.
Chương 18. File I/O
Luồng và bộ đệm, mở đóng file, văn bản và nhị phân, truy cập ngẫu nhiên, định dạng tệp tự thiết kế, ghi an toàn.
- 18.1Luồng và kiểu FILELuồng là gì, ba luồng mở sẵn, và vì sao bộ đệm quyết định dữ liệu của bạn còn hay mất.22 phút
- 18.2Mở và đóng fileSáu chế độ của fopen, cái bẫy xóa sạch của chế độ ghi, và vì sao phải kiểm tra cả fclose.24 phút
- 18.3Đọc ghi văn bản theo dòngfgets, fputs, fgetc và bốn lỗi kinh điển khi đọc file theo dòng.26 phút
- 18.4fprintf và fscanfGhi có định dạng, và vì sao nên thay fscanf bằng fgets cộng sscanf.24 phút
- 18.5File nhị phânfread và fwrite, sáu khác biệt với file văn bản, và ba cạm bẫy làm hỏng dữ liệu.28 phút
- 18.6Truy cập ngẫu nhiên với fseek và ftellNhảy tới bản ghi thứ i, sửa tại chỗ, và quy tắc bắt buộc khi vừa đọc vừa ghi.26 phút
- 18.7Đọc cả file vào bộ nhớThành ngữ đọc trọn một file, và vì sao nó hỏng với ống dẫn và file văn bản.24 phút
- 18.8Tự thiết kế định dạng tệpSố nhận dạng, phiên bản, và cách đóng gói tường minh để tệp còn đọc được sau này.28 phút
- 18.9Đọc và ghi CSVQuy tắc thoát dấu nháy, dấu phẩy trong trường, và một bộ tách CSV tự viết.26 phút
- 18.10Ghi an toàn và xử lý lỗiGhi ra tệp tạm rồi đổi tên, và vì sao fflush chưa đủ để dữ liệu nằm trên đĩa.26 phút
- 18.11Project: thiết kế hệ quản lý sinh viênChia tầng, thiết kế cấu trúc dữ liệu, và tầng lưu trữ với hai định dạng.30 phút
- 18.12Project: chức năng, kiểm thử và hoàn thiệnTìm kiếm, sắp xếp, thống kê, kiểm tra dữ liệu vào và danh sách nghiệm thu.30 phút
Preprocessor và tổ chức project
Hết viết tất cả trong một file. Chia dự án nhiều file và dùng preprocessor đúng cách.
Chương 19. Preprocessor
include, define, macro, biên dịch có điều kiện, header guard.
- 19.1Preprocessor làm gìBốn giai đoạn từ mã nguồn tới chương trình chạy, và vì sao preprocessor không hiểu C.22 phút
- 19.2define và macro đối tượngThay thế văn bản thuần túy, phạm vi của macro, và vì sao const thường tốt hơn.22 phút
- 19.3Macro hàm và ba cạm bẫyThiếu ngoặc, đánh giá nhiều lần, và nhiều câu lệnh không bọc.28 phút
- 19.4Khi nào macro, khi nào hàmstatic inline an toàn hơn ở mọi mặt, trừ bốn trường hợp macro vẫn thắng.24 phút
- 19.5Toán tử biến thành chuỗi và nối tokenDấu thăng, dấu thăng đôi, và mẹo hai tầng để macro bên trong được bung trước.24 phút
- 19.6Biên dịch có điều kiệnifdef, if, error, phát hiện nền tảng, hệ thống nhật ký tắt được, và assert.28 phút
- 19.7Header guard và cách viết headerVì sao include hai lần là lỗi, quy ước đặt tên guard, và bốn thứ không bao giờ để trong header.26 phút
Chương 20. Multi-file project
Chia .c và .h, khai báo và định nghĩa, extern, static, liên kết.
- 20.1Chia dự án thành nhiều tệpCấu trúc thư mục, ranh giới giữa giao diện và cài đặt, và cách quyết định tách ở đâu.24 phút
- 20.2Khai báo và định nghĩaHai khái niệm khác nhau mà cùng một cú pháp, và quy tắc một định nghĩa.26 phút
- 20.3Liên kết trong và liên kết ngoàistatic ở phạm vi tệp, extern cho biến toàn cục, và cái bẫy định nghĩa tạm thời.28 phút
- 20.4Biên dịch, liên kết và build lại từng phầnTừ .c sang .o rồi sang chương trình, và vì sao tách hai bước lại nhanh hơn.26 phút
- 20.5Sơ đồ phụ thuộc và kiểu mờPhụ thuộc phải đi một chiều, và cách phá vòng bằng khai báo trước.26 phút
- 20.6Tái cấu trúc project Phần 8Tách một tệp lớn thành năm module, từng bước, luôn giữ chương trình chạy được.30 phút
Data Structures
Tự cài các cấu trúc dữ liệu nền tảng bằng con trỏ và cấp phát động.
Chương 21. Linked List
Danh sách đơn, đôi, vòng. Thêm, xóa, tìm, đảo ngược.
- 21.1Node và bố cục bộ nhớKiểu tự tham chiếu, một nút nằm ở đâu trong bộ nhớ, và bảng so sánh đầy đủ với mảng.24 phút
- 21.2Danh sách liên kết đơnStruct gói head, tail, size. Khởi tạo, in, hủy, và những bất biến phải giữ.26 phút
- 21.3Thêm phần tửThêm đầu, thêm cuối, chèn giữa, và vì sao giữ tail biến O(n) thành O(1).26 phút
- 21.4Xóa phần tửXóa đầu, xóa cuối, xóa theo giá trị, và mẹo con trỏ tới con trỏ.28 phút
- 21.5Tìm kiếmTìm theo giá trị, tìm theo vị trí, tìm nút trước, và vì sao danh sách chậm hơn mảng.18 phút
- 21.6Đảo ngược và hai con trỏĐảo ngược tại chỗ bốn bước, đảo bằng đệ quy, tìm nút giữa, phát hiện chu trình.26 phút
- 21.7Danh sách liên kết đôiHai con trỏ mỗi nút, xóa O(1) khi đã có địa chỉ, và mẫu list_head của nhân Linux.26 phút
- 21.8Danh sách vòngNút cuối trỏ về đầu, điều kiện dừng khác hẳn, và bài toán Josephus.22 phút
Chương 22. Stack
Cài bằng mảng và bằng danh sách liên kết, ứng dụng tính biểu thức.
- 22.1Ngăn xếp bằng mảngLIFO, chỉ số top, tràn trên và tràn dưới, và vì sao mọi thao tác là O(1).22 phút
- 22.2Ngăn xếp bằng danh sách liên kếtKhông giới hạn kích thước, đổi lại một lần cấp phát cho mỗi phép push.20 phút
- 22.3Ứng dụng của ngăn xếpKiểm tra ngoặc, đảo chuỗi, hoàn tác, và chuyển đệ quy thành vòng lặp.26 phút
- 22.4Máy tính biểu thứcShunting-yard chuyển trung tố sang hậu tố, rồi tính hậu tố bằng ngăn xếp.30 phút
Chương 23. Queue
Hàng đợi, hàng đợi vòng, deque, hàng đợi ưu tiên.
- 23.1Hàng đợi cơ bảnFIFO, hai con trỏ front và rear, và vì sao thiếu rear thì enqueue thành O(n).22 phút
- 23.2Hàng đợi vòngMảng vòng bằng phép chia dư, phân biệt rỗng với đầy, và ring buffer nhúng.26 phút
- 23.3DequeThêm và lấy ở cả hai đầu, cài bằng danh sách đôi và bằng mảng vòng.20 phút
- 23.4Hàng đợi ưu tiên và heapHeap nhị phân trên mảng, sift up và sift down, và vì sao dựng heap chỉ tốn O(n).30 phút
Chương 24. Tree
Cây nhị phân, bốn kiểu duyệt, cây tìm kiếm nhị phân, AVL.
- 24.1Cây nhị phânThuật ngữ, chiều cao, số nút tối đa, và phân biệt cây đầy với cây cân bằng.22 phút
- 24.2Bốn kiểu duyệt câyTiền, trung, hậu thứ tự và duyệt theo tầng. Vì sao hủy cây bắt buộc hậu thứ tự.28 phút
- 24.3Cây tìm kiếm nhị phânTính chất BST, vì sao trung thứ tự cho dãy đã sắp, và cây suy biến.22 phút
- 24.4Chèn vào BSTBản đệ quy theo mẫu trả về gốc, bản lặp, và cách xử lý khóa trùng.22 phút
- 24.5Tìm trong BSTTìm bằng vòng lặp, tìm nhỏ nhất và lớn nhất, nút kế tiếp và nút liền trước.18 phút
- 24.6Xóa khỏi BSTBa trường hợp, chọn nút thế mạng, và vì sao phải xóa tiếp ở cây con phải.28 phút
- 24.7Cây AVLHệ số cân bằng, bốn kiểu mất cân bằng, và hai phép xoay dựng nên tất cả.32 phút
Chương 25. Hash Table
Hàm băm, va chạm, chaining, open addressing, rehash.
- 25.1Hàm bămBa yêu cầu, djb2 và FNV-1a, và vì sao hàm băm tự nghĩ thường hỏng.24 phút
- 25.2Va chạmNguyên lý chuồng bồ câu, nghịch lý ngày sinh, và hai hướng xử lý.18 phút
- 25.3ChainingMỗi ô là một danh sách. Cài đủ put, get, remove, và quản lý sở hữu khóa.28 phút
- 25.4Open addressingDò tuyến tính, dò bậc hai, băm kép, và bia mộ khi xóa.26 phút
- 25.5Hệ số tải và rehashNgưỡng rehash, chi phí khấu hao, và chọn số bucket.24 phút
Algorithms
Cài và phân tích các thuật toán nền tảng, biết chọn đúng thuật toán.
Chương 26. Searching
Tìm tuyến tính, tìm nhị phân và độ phức tạp.
Chương 27. Sorting
Tám thuật toán sắp xếp, so sánh và cách chọn.
- 27.1Bubble sortBản ngây thơ, cờ dừng sớm, và vì sao nó vẫn đáng học dù không ai dùng.20 phút
- 27.2Selection sortÍt hoán đổi nhất, luôn là O(n bình phương), và vì sao nó không ổn định.18 phút
- 27.3Insertion sortO(n) khi dữ liệu gần sắp, dịch thay vì hoán đổi, và vai trò trong introsort.24 phút
- 27.4Merge sortChia đôi, trộn hai nửa, bộ nhớ phụ, và vì sao nó ổn định.28 phút
- 27.5Quick sortPhân hoạch Lomuto và Hoare, chọn chốt, và cách chặn đệ quy quá sâu.30 phút
- 27.6Heap sortDựng heap tại chỗ, rút gốc n trừ một lần, và O(1) bộ nhớ phụ.26 phút
- 27.7Sắp xếp không so sánhCounting sort, radix sort, và vì sao chúng không phá giới hạn dưới n log n.24 phút
- 27.8So sánh và cách chọnBảng tổng hợp tám thuật toán, introsort mà qsort dùng, và cách đo trung thực.24 phút
Chương 28. Algorithm nâng cao
Chia để trị, tham lam, quy hoạch động, quay lui, đồ thị.
- 28.1Chia để trịBa bước, định lý thợ, lũy thừa nhanh, và cách ước lượng từ công thức truy hồi.26 phút
- 28.2Tham lamHai điều kiện để tham lam đúng, đổi tiền, chọn hoạt động, và mã Huffman.26 phút
- 28.3Quy hoạch độngTừ trên xuống và từ dưới lên, năm bước giải, và bốn bài kinh điển.32 phút
- 28.4Quay luiChọn, đệ quy, bỏ chọn, cắt tỉa, và bài toán tám hậu.26 phút
- 28.5Đồ thị, BFS và DFSMa trận kề và danh sách kề, duyệt theo tầng và theo chiều sâu.30 phút
- 28.6Đường đi ngắn nhất và cây khungDijkstra, Bellman-Ford, Floyd-Warshall, và Kruskal với union-find.32 phút
C nâng cao
Con trỏ hàm ở tầng thiết kế, lập trình tổng quát, thao tác bit và các từ khóa quyết định.
Chương 29. Function Pointer
Callback, bảng điều phối, máy trạng thái, mô phỏng đa hình, closure.
- 29.1Cú pháp con trỏ hàmKhai báo, typedef, và cách đọc những khai báo trông rối mắt.24 phút
- 29.2Hàm gọi lạiTách chính sách khỏi cơ chế, và quy tắc thiết kế API nhận callback.26 phút
- 29.3Bảng điều phốiThay chuỗi if và switch dài bằng một bảng tra, và đo xem có nhanh hơn không.26 phút
- 29.4Máy trạng thái bằng con trỏ hàmBa cách cài máy trạng thái, và khi nào con trỏ hàm thắng switch.26 phút
- 29.5Đa hình thủ công bằng vtableCách nhân Linux làm, và cũng chính là cách C++ cài đặt từ khóa virtual.30 phút
- 29.6Closure trong CC không có lambda. Năm cách mô phỏng, và cách nào đáng dùng.28 phút
Chương 30. Generic Programming
void*, generic swap, container tổng quát, qsort, bsearch, _Generic.
- 30.1Con trỏ void và cái giá của nóKiểu bị xóa đi, và bốn thứ bạn mất khi dùng con trỏ không kiểu.24 phút
- 30.2Vector tổng quát: hai cáchCon trỏ void với kích thước phần tử, so với macro sinh mã.28 phút
- 30.3Danh sách kiểu nhân LinuxNhúng node vào struct thay vì nhúng dữ liệu vào node, và macro container_of.28 phút
- 30.4qsort và bsearchHai hàm tổng quát của thư viện chuẩn, và bốn cách viết sai hàm so sánh.26 phút
- 30.5_Generic của C11Chọn hàm theo kiểu ngay lúc biên dịch, và giới hạn của nó.24 phút
Chương 31. Bit Manipulation
Toán tử bit, set, clear, toggle, bitmask, thao tác thanh ghi.
- 31.1Biểu diễn nhị phânBốn cách viết hằng số, và hàm in bit của bất kỳ đối tượng nào.22 phút
- 31.2Sáu toán tử bit và ba cạm bẫyAND, OR, XOR, NOT, dịch trái, dịch phải, và ba chỗ hành vi không xác định.26 phút
- 31.3Bật, tắt, đảo và kiểm tra bitBốn thao tác cơ bản, và bộ macro nên có trong mọi dự án.24 phút
- 31.4Bitmask và trường bitNhiều cờ trong một biến, và vì sao bit field không dùng cho giao thức nhị phân.26 phút
- 31.5Thủ thuật bit và hàm dựng sẵnMười thủ thuật kinh điển, và các hàm dựng sẵn dùng thẳng lệnh CPU.28 phút
- 31.6Bitset lớn và ứng dụngMảng bit tiết kiệm tám lần bộ nhớ, và sàng Eratosthenes làm ví dụ.26 phút
Chương 32. volatile, const, restrict
Ba từ khóa quyết định khi làm hệ thống và hệ nhúng.
- 32.1volatileBốn trường hợp bắt buộc, và vì sao nó không phải công cụ đồng bộ đa luồng.28 phút
- 32.2const là hợp đồngNó nói với trình biên dịch và với người đọc, chứ không bảo vệ bộ nhớ.24 phút
- 32.3restrictLời hứa không có con trỏ nào khác trỏ vào đây, và cái giá khi thất hứa.26 phút
- 32.4Project: thư viện tiện ích hệ thốngBốn module gói lại mọi thứ của Phần 12, kèm kiểm thử đầy đủ.30 phút
Undefined Behavior và C chuyên sâu
Phân biệt lập trình viên C nghiệp dư với chuyên nghiệp.
Chương 33. Undefined Behavior
UB, unspecified, implementation-defined, strict aliasing.
- 33.1Bốn mức hành vi trong chuẩn CUndefined, unspecified, implementation-defined, locale-specific, và vì sao phải phân biệt.26 phút
- 33.2Vì sao UB nguy hiểm hơn chương trình sậpTrình biên dịch được phép giả định UB không xảy ra, nên nó xóa luôn mã kiểm tra của bạn.30 phút
- 33.3Mười sáu hành vi không xác định phải thuộcBảng tra đầy đủ, mỗi mục kèm mã chạy được và cách sửa đúng.32 phút
- 33.4Tràn số và cách kiểm tra đúngVì sao if (x + 1 < x) không chạy, và ba cách viết đúng.28 phút
- 33.5Điểm tuần tự và thứ tự đánh giái = i++ + ++i và những biểu thức không ai nên viết.26 phút
- 33.6Strict aliasingĐọc bit của float bằng ép con trỏ là sai, và ba cách đúng.30 phút
- 33.7Implementation-defined và unspecifiedsizeof(int), char có dấu hay không, và những thứ khác nhau giữa các máy.24 phút
Chương 34. Memory Debugging
Valgrind, AddressSanitizer, UndefinedBehaviorSanitizer.
- 34.1Bốn công cụ và khi nào dùng cái nàoGDB, Valgrind, AddressSanitizer, UndefinedBehaviorSanitizer: mỗi cái bắt loại lỗi khác nhau.24 phút
- 34.2AddressSanitizerBắt tràn bộ đệm, use-after-free, double free và rò rỉ, nhanh hơn Valgrind mười lần.30 phút
- 34.3UndefinedBehaviorSanitizerBắt tràn số có dấu, dịch bit sai, chia cho không, con trỏ lệch căn chỉnh.26 phút
- 34.4Valgrind và bốn loại rò rỉdefinitely lost, indirectly lost, possibly lost, still reachable.28 phút
- 34.5Năm nguyên nhân của lỗi phân đoạnNULL, ngoài biên xa, ghi vào vùng chỉ đọc, tràn ngăn xếp, dùng sau khi giải phóng.28 phút
- 34.6Lab: săn mười lỗi trong một tệpMột tệp bugs.c có mười lỗi đánh số, tìm hết bằng công cụ chứ không đọc mã.32 phút
Chương 35. GDB
Điểm dừng, bước chạy, xem bộ nhớ, watchpoint, backtrace.
- 35.1Biên dịch để gỡ lỗi và khởi động GDBCờ -g, -g3, -O0, và năm cách nạp chương trình vào GDB.22 phút
- 35.2Điểm dừng và điều khiển luồng chạybreak, tbreak, điểm dừng có điều kiện, next, step, finish, until.28 phút
- 35.3Xem dữ liệu: print, x và ptypeIn biến, in mảng, in theo định dạng, và đọc bộ nhớ thô.30 phút
- 35.4Gỡ lỗi con trỏ và cấu trúc dữ liệuĐi theo chuỗi con trỏ, duyệt danh sách liên kết bằng vòng lặp trong GDB.28 phút
- 35.5Watchpoint, vũ khí mạnh nhất của GDBDừng đúng dòng đã ghi đè lên biến, kèm giá trị cũ và giá trị mới.26 phút
- 35.6Quy trình sáu bước và tệp .gdbinitTừ tái hiện lỗi tới viết kiểm thử hồi quy, và cách cấu hình GDB một lần cho mãi mãi.24 phút
- 35.7Project: báo cáo săn lỗiMột dự án C có mười lăm lỗi, nộp báo cáo, bản vá, bằng chứng và bộ kiểm thử hồi quy.32 phút
Build System
Tự động hóa build, phân biệt debug và release, tích hợp kiểm thử.
Chương 36. GCC chuyên sâu
Các nhóm cờ cảnh báo, tối ưu, gỡ lỗi, sanitizer, gia cố bảo mật.
- 36.1Bốn giai đoạn và cách xem từng cáiTiền xử lý, biên dịch, hợp dịch, liên kết, và cờ để dừng ở mỗi bước.26 phút
- 36.2Mức tối ưu và LTOTừ -O0 tới -O3, -Os, -Og, -flto, và cách đo thay vì đoán.28 phút
- 36.3Ba nhóm cờ: cảnh báo, chuẩn, gỡ lỗiBộ cờ cảnh báo, chọn chuẩn ngôn ngữ, và cờ debug cho GDB.24 phút
- 36.4Bản debug và bản phát hànhHai hồ sơ build, sanitizer, gia cố bảo mật, và strip.26 phút
Chương 37. Makefile
Mục tiêu, phụ thuộc, biến, quy tắc ngầm, theo dõi header tự động.
- 37.1Cú pháp cơ bản và cái bẫy TABMục tiêu, phụ thuộc, công thức, và vì sao phải là TAB.24 phút
- 37.2Biến, biến tự động, quy tắc mẫuBốn cách gán, $@ $< $^, và một quy tắc cho mọi file .c.26 phút
- 37.3Theo dõi header tự động-MMD -MP, và vì sao thiếu nó là bug khó hiểu nhất của Make.28 phút
- 37.4Project: Makefile đa cấu hìnhMột Makefile dùng được cho mọi dự án nhỏ và vừa.30 phút
Chương 38. CMake
CMakeLists, target, thư viện, build type, testing.
Static Library / Dynamic Library
Đóng gói mã thành thư viện dùng lại được, hiểu liên kết và ABI.
Chương 39. Library
Thư viện tĩnh, thư viện động, ký hiệu, ABI và hệ thống plugin.
- 39.1Thư viện tĩnh chỉ là một kho lưu trữar, nm, và bên trong một tệp .a thật sự có gì.26 phút
- 39.2Thứ tự -l và cách trình liên kết duyệtVì sao gcc -lm main.c thất bại mà gcc main.c -lm thành công.24 phút
- 39.3Thư viện động và vì sao cần -fPICTạo .so trên Linux và .dll trên Windows, và mã độc lập vị trí là gì.30 phút
- 39.4Tĩnh hay động: sáu tiêu chíKích thước, bộ nhớ, tốc độ khởi động, vá lỗi, triển khai và rủi ro.26 phút
- 39.5Đọc bảng ký hiệunm, objdump, readelf và bảy chữ cái phải thuộc.28 phút
- 39.6Điều khiển ký hiệu xuất raMặc định thư viện xuất ra mọi thứ, và đó là vấn đề.26 phút
- 39.7ABI và những thứ phá vỡ nóAPI là mã nguồn, ABI là nhị phân, và nhầm hai thứ đó rất tốn kém.30 phút
- 39.8Kiểu mờ và cách giữ ABI ổn địnhNgười dùng không biết kích thước struct thì bạn đổi nó thoải mái.28 phút
- 39.9Đánh số phiên bản và SONAMElibmy.so.1.2.3, SONAME và semantic versioning cho thư viện.24 phút
- 39.10Nạp thư viện lúc chạydlopen trên POSIX, LoadLibrary trên Windows, và cách ép kiểu con trỏ hàm cho đúng.28 phút
- 39.11Hệ thống pluginMột chương trình chính nạp mọi thư viện trong một thư mục, mỗi cái đăng ký một lệnh.30 phút
- 39.12Project: đóng gói mathlibCùng một mã nguồn, xuất ra cả .a lẫn .so, kèm Makefile và pkg-config.30 phút
Linux System Programming
Nói chuyện trực tiếp với hệ điều hành.
Chương 40. Linux Process
PID, fork, exec, wait, zombie và orphan.
- 40.1Tiến trình, PID, và /procMột chương trình đang chạy gồm những gì, và cách nhìn vào nó.24 phút
- 40.2fork và Copy-on-WriteNhân đôi một tiến trình, ba giá trị trả về, và cái bẫy bộ đệm.28 phút
- 40.3exec và mẫu fork cộng execThay chương trình đang chạy, và nền tảng của mọi shell.26 phút
- 40.4wait, zombie, và orphanThu hoạch tiến trình con, và hai trạng thái phải hiểu.26 phút
Chương 41. File Descriptor
open, read, write, close, dup2 và chuyển hướng.
Chương 42. System Call
Ranh giới user space và kernel, errno, strace, mmap.
Chương 43. Pipe
Pipe, named pipe, giao tiếp giữa các tiến trình.
Chương 44. Signal
SIGINT, SIGTERM, sigaction và quy tắc viết handler.
Chương 45. Thread
pthread, mutex, đua dữ liệu, deadlock, biến điều kiện.
- 45.1pthread, create và joinLuồng chia sẻ bộ nhớ, tạo và chờ, và bẫy truyền tham số.26 phút
- 45.2Race condition và mutexVì sao dem cộng cộng không nguyên tử, và cách khoá.28 phút
- 45.3Deadlock và cách tránhBốn điều kiện Coffman, và phá vỡ chờ vòng tròn.26 phút
- 45.4Condition variable và producer-consumerChờ một điều kiện, và mẫu hàng đợi vòng nhiều luồng.28 phút
- 45.5Atomic, semaphore, và thread poolNguyên tử không cần mutex, false sharing, và bể luồng.28 phút
Network Programming bằng C
Viết được server và client TCP, UDP, hiểu socket API.
Chương 46. Socket
TCP, UDP, socket API, ranh giới thông điệp, ghép kênh vào ra.
- 46.1Chồng giao thức, TCP và UDPBốn tầng, bắt tay ba bước, và sáu tiêu chí chọn giữa TCP với UDP.26 phút
- 46.2Socket API và thứ tự byteBảy hàm cốt lõi, struct sockaddr_in, và vì sao htons là bắt buộc.28 phút
- 46.3Server TCP đầu tiênNăm bước, kèm SO_REUSEADDR và cách xử lý lỗi cho từng bước.30 phút
- 46.4Client TCPBa bước, và bốn lỗi hay gặp khi kết nối.24 phút
- 46.5TCP là dòng byteBa lần send năm byte có thể thành một lần recv mười lăm byte.26 phút
- 46.6send_all, recv_all và giao thức tiền tố độ dàiHai hàm bắt buộc phải có, và một giao thức hoàn chỉnh.30 phút
- 46.7UDPKhông kết nối, bảo toàn ranh giới gói, và bốn thứ bạn phải tự làm.26 phút
- 46.8Bốn kiến trúc phục vụ nhiều clientTuần tự, fork, luồng, và ghép kênh vào ra.28 phút
- 46.9select, poll và epollMột luồng phục vụ hàng nghìn kết nối, và ba API làm điều đó.30 phút
- 46.10Project: máy chủ chat nhiều clientNăm mươi client, giao thức tiền tố độ dài, lệnh, phòng, và thoát sạch.32 phút
Embedded C
Nhánh chuyên sâu cho STM32, ESP32 và các vi điều khiển.
Chương 47. Embedded C
Kiến trúc MCU, thanh ghi, GPIO, UART, SPI, I2C, ADC, PWM, DMA.
- 47.1Kiến trúc MCUBên trong một vi điều khiển, và tám khác biệt so với lập trình trên máy tính.24 phút
- 47.2Bản đồ bộ nhớVào ra ánh xạ bộ nhớ, bốn vùng địa chỉ, và vì sao đọc một địa chỉ lại điều khiển được đèn.24 phút
- 47.3Thanh ghi và volatileHai cách khai báo thanh ghi, vì sao volatile là bắt buộc, và điều nó không bảo đảm.28 phút
- 47.4GPIONăm bước cấu hình một chân, và vì sao BSRR an toàn hơn ODR.28 phút
- 47.5Chống rung nút bấmVì sao một lần nhấn cho hàng chục xung, và ba cách lọc chúng.22 phút
- 47.6UARTKhung truyền, tính tốc độ baud, và bộ đệm vòng nhận bằng ngắt.30 phút
- 47.7SPI, I2C, ADC, PWM và DMASáu ngoại vi còn lại, chọn cái nào cho việc gì, và số học không dùng số thực.30 phút
Chương 48. Register Programming
Đọc datasheet, mẫu thao tác thanh ghi, trường bit.
- 48.1Mẫu đọc sửa ghiBa cách viết sai kinh điển, và mẫu ba bước xóa rồi đặt rồi ghi.26 phút
- 48.2Macro và hàm nội tuyến cho thanh ghiĐặt tên cho từng bit, và vì sao hàm nội tuyến tốt hơn macro.24 phút
- 48.3Trường bit cho thanh ghiCú pháp gọn, và năm điều chuẩn C không bảo đảm khiến nó nguy hiểm.24 phút
- 48.4Đọc datasheetNăm loại tài liệu, quy trình tám bước cấu hình một ngoại vi, và errata.26 phút
Chương 49. Interrupt
Bảng vector, NVIC, quy tắc viết ISR, vùng tới hạn.
- 49.1Cơ chế ngắtSáu bước phần cứng làm khi ngắt xảy ra, và độ trễ thực tế.26 phút
- 49.2Bảng vector và NVICBảng vector nằm ở đâu, tên hàm phải khớp thế nào, và độ ưu tiên lồng nhau.26 phút
- 49.3Bảy quy tắc viết ISRXóa cờ, làm tối thiểu, và mẫu ISR đặt cờ còn vòng lặp chính xử lý.28 phút
- 49.4Vùng tới hạnVì sao đọc một biến 32 bit cũng có thể sai, và cách vào ra an toàn khi lồng nhau.26 phút
- 49.5volatile và atomicvolatile giải quyết được gì, không giải quyết được gì, và khi nào cần atomic.26 phút
Chương 50. Embedded Project
Từ điều khiển LED tới mini RTOS, kèm chuỗi công cụ.
- 50.1Bộ điều khiển LED và máy trạng tháiVòng lặp chính không chặn, tick một mili giây, và máy trạng thái điều khiển chế độ.28 phút
- 50.2Vỏ lệnh UARTBộ đệm vòng, tách dòng lệnh, bảng lệnh bằng con trỏ hàm, và xử lý phím xóa.30 phút
- 50.3Đo nhiệt độ và số học dấu chấm cố địnhĐọc ADC, đổi sang đơn vị vật lý bằng số nguyên, và lọc nhiễu.28 phút
- 50.4Chuỗi công cụ, nạp và gỡ lỗiBiên dịch chéo, tệp linker, phân đoạn, và ba cách gỡ lỗi khi không có printf.28 phút
- 50.5Mini RTOSChuyển ngữ cảnh bằng PendSV, bộ lập lịch, và delay không chặn.32 phút
C nâng cao nhất
Đọc được chuẩn C, hiểu mô hình bộ nhớ ở tầng chuẩn, làm chủ preprocessor và lập trình tổng quát.
Chương 51. C Standard
Lịch sử chuẩn, C99, C11, C23, và cách viết mã khả chuyển.
- 51.1Lịch sử các chuẩn CTừ K&R tới C23, và vì sao dự án của bạn vẫn đang dùng C99.24 phút
- 51.2C99, bước nhảy lớn nhấtKhai báo giữa khối, bool, khởi tạo chỉ định, compound literal, stdint.h.28 phút
- 51.3C11 và C23_Generic, _Static_assert, _Alignas, rồi nullptr, constexpr, typeof, #embed.30 phút
- 51.4Đọc chuẩn và viết mã khả chuyểnBản nháp N1570, cấu trúc tài liệu, và bảy giả định sai hay gặp.26 phút
Chương 52. Advanced Memory Model
Vòng đời đối tượng, căn chỉnh, kiểu hiệu dụng, compound literal.
- 52.1Vòng đời đối tượngBốn thời gian lưu trữ, và vì sao đọc một con trỏ treo cũng là UB.26 phút
- 52.2Căn chỉnh_Alignof, _Alignas, aligned_alloc, và vì sao ARM sập còn x86 chỉ chậm.28 phút
- 52.3Kiểu hiệu dụngBộ nhớ từ malloc chưa có kiểu, và lần ghi đầu tiên quyết định nó.28 phút
- 52.4Compound literal và thời gian sốngCùng một cú pháp, hai thời gian sống hoàn toàn khác nhau.24 phút
Chương 53. Struct Memory Layout
Bố cục, đệm, offsetof, container_of, packed và tuần tự hóa.
- 53.1Quy tắc bố cục structNăm quy tắc chuẩn bảo đảm, và cách tính sizeof bằng tay.26 phút
- 53.2Sắp xếp trường để tiết kiệm bộ nhớĐổi thứ tự khai báo, tiết kiệm ba mươi ba phần trăm, không đổi một dòng logic.26 phút
- 53.3offsetof, container_of và kiểm tra bố cụcTính ngược từ một trường ra đối tượng chứa nó, và chốt bố cục lúc dịch.26 phút
- 53.4Packed struct và cách tuần tự hóa đúngBa vấn đề của packed, và vì sao đừng dùng nó cho giao thức mạng.28 phút
Chương 54. Advanced Preprocessor
Macro hàm, biến đối số, nối, chuỗi hóa, X Macro.
- 54.1Macro hàm và các bẫyNgoặc, đánh giá nhiều lần, và do while (0).26 phút
- 54.2Macro biến đối số, nối và chuỗi hóa__VA_ARGS__, __VA_OPT__, toán tử # và ##.26 phút
- 54.3X MacroKhai báo danh sách một lần, sinh ra enum, bảng tên, bảng mô tả và hàm phân tích.30 phút
- 54.4Thủ thuật và cách gỡ lỗi macroARRAY_LEN an toàn, tên biến duy nhất, và bốn lệnh xem macro bung ra gì.26 phút
Chương 55. Generic Data Structures
Vector, danh sách, heap, cây, bảng băm bằng void * và con trỏ hàm.
- 55.1Thiết kế giao diện container tổng quátSáu kiểu con trỏ hàm, kiểu mờ, và tám nguyên tắc thiết kế thư viện.28 phút
- 55.2Vector và danh sáchHai container nền tảng, cài đầy đủ với void * và kiểm thử.30 phút
- 55.3Heap, cây và bảng bămBa container còn lại, và chỗ mỗi cái mạnh hơn hai cái kia.30 phút
- 55.4Project: thư viện cds hoàn chỉnhNăm container, một giao diện, bộ kiểm thử đầy đủ và tài liệu.32 phút
Software Engineering với C
Viết mã người khác đọc được, kiểm thử được, phân tích được và an toàn.
Chương 56. Code Quality
Đặt tên, quy ước, module, xử lý lỗi, lập trình phòng vệ.
- 56.1Đặt tênTên là tài liệu đọc nhiều nhất trong dự án của bạn.24 phút
- 56.2Quy ước viết mãclang-format, EditorConfig, và những thứ không nên tranh cãi.26 phút
- 56.3Chia module và đóng góiMột module là một header, một tệp .c, và một trách nhiệm.28 phút
- 56.4Xử lý lỗiBốn chiến lược, và cách chọn một cái rồi giữ nó nhất quán.30 phút
- 56.5Lập trình phòng vệKiểm tra đầu vào, khẳng định, và ranh giới tin cậy.26 phút
Chương 57. Testing
Kiểm thử đơn vị, thiết kế ca kiểm thử, giả lập, độ phủ.
- 57.1Kiểm thử đơn vịMột khung kiểm thử nhỏ, và ba khung có sẵn nếu bạn muốn.28 phút
- 57.2Thiết kế ca kiểm thửGiá trị biên, lớp tương đương, và đường lỗi.28 phút
- 57.3Giả lập phụ thuộcBốn cách thay một phụ thuộc bằng bản giả trong C.28 phút
- 57.4Độ phủ và tích hợp liên tụcgcov, lcov, và một quy trình chạy mọi thứ tự động.26 phút
Chương 58. Static Analysis
Cảnh báo trình biên dịch, clang-tidy, cppcheck, quy trình.
Chương 59. Security trong C
Tràn bộ đệm, chuỗi định dạng, chèn lệnh, TOCTOU, fuzzing.
- 59.1Tràn bộ đệm và tràn ngăn xếpCách một chuỗi quá dài biến thành quyền điều khiển chương trình.30 phút
- 59.2Chuỗi định dạng và tràn sốprintf(s) là một lỗ hổng, và tràn số là cách vượt qua kiểm tra kích thước.28 phút
- 59.3Chèn lệnh, đường dẫn và TOCTOUBa lỗ hổng đến từ việc tin vào dữ liệu và tin vào thời gian.28 phút
- 59.4Checklist bảo mật và fuzzingMười hai mục phải kiểm, và cách để máy tự tìm lỗ hổng cho bạn.28 phút
Project tổng kết
Tám dự án theo cấp độ tăng dần, từ máy tính bỏ túi đến mini RTOS.
Chương 60. Tám dự án tổng kết
Tám dự án theo cấp độ tăng dần, từ máy tính bỏ túi đến mini RTOS.
- 60.1Level 1: Máy tính dòng lệnhĐọc biểu thức an toàn, năm phép toán, và xử lý mọi đầu vào rác.22 phút
- 60.2Level 2: Quản lý sinh viênMảng động, CRUD, tìm kiếm, sắp xếp nhiều tiêu chí, lưu tệp.26 phút
- 60.3Level 3: Quản lý thư việnDanh sách liên kết, bảng băm tra cứu, mượn trả, hoàn tác.28 phút
- 60.4Level 4: Mini Shellfork, exec, pipe, chuyển hướng, chạy nền, và dọn zombie.30 phút
- 60.5Level 5: Máy chủ chat TCPepoll cho trăm client, giao thức tiền tố độ dài, thoát sạch.28 phút
- 60.6Level 6: Máy chủ HTTP nhỏPhân tích HTTP, phục vụ tệp tĩnh, và chống duyệt đường dẫn.30 phút
- 60.7Level 7: Hệ thống nhúngSTM32, cấp phát tĩnh, số dấu phẩy cố định, và ngắt gọn.26 phút
- 60.8Level 8: Mini RTOSChuyển ngữ cảnh, bộ lập lịch, semaphore, và hàng đợi thông điệp.32 phút