Khóa học lập trình C bằng tiếng Việt
Từ nguyên lý máy tính đến kỹ thuật nâng cao
Khóa học lập trình C tiếng Việt, đi từ cách máy tính chạy một chương trình cho tới hệ thống, mạng và lập trình nhúng. Mỗi bài đều có mã nguồn chạy được, sơ đồ minh họa và bài tập tự làm.
- Phần
- 22
- Chương
- 60
- Bài đã có
- 346
- Phút nội dung
- 8116
Khóa học này khác gì
Bắt đầu từ nguyên lý
Không dạy cú pháp trước. Bạn hiểu chương trình nằm ở đâu và chạy ra sao, rồi mới học viết.
Mọi bài đều chạy được
Không có lý thuyết suông. Mỗi khái niệm đi kèm mã nguồn và lệnh terminal để tự kiểm chứng.
Dạy cả cạm bẫy
Tràn bộ đệm, con trỏ treo, hành vi không xác định. Những thứ khiến C khó dùng đúng.
Tới tận hệ thống và nhúng
Lộ trình đi từ Hello World cho tới lập trình Linux, mạng, vi điều khiển và mini RTOS.
Nội dung đã sẵn sàng
Toàn bộ lộ trìnhPhần 0
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.
- 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
Phần 1
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.
- 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
- 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
- 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
- 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
Phần 2
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.
- 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
- 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
Phần 3
Hàm
Chia chương trình thành hàm, hiểu khung ngăn xếp, nắm đệ 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
Phần 4
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.
- 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
- 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
- 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
Phần 5
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.
- 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
- 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
Phần 6
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ớ.
- 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
Phần 7
Struct / Union / Enum
Gom dữ liệu thành kiểu mới, hiểu padding và alignment.
- 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
- 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
- 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
Phần 8
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.
- 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
Phần 9
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.
- 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
- 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
Phần 10
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.
- 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
- 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
- 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
- 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
- 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
Phần 11
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.
- 26.1Tìm tuyến tínhVòng lặp cơ bản, mẹo lính gác, và khi nào tuyến tính mới là lựa chọn đúng.20 phút
- 26.2Tìm nhị phânNửa khoảng, lỗi tràn kinh điển, biên trái và biên phải, và bsearch.28 phút
- 26.3Độ phức tạp và cách chọnKý hiệu O lớn, ba cách tìm đặt cạnh nhau, và tiêu chí chọn.22 phút
- 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
- 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
Phần 12
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.
- 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
- 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
- 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
- 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
Phần 13
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.
- 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
- 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
- 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
Phần 14
Build System
Tự động hóa build, phân biệt debug và release, tích hợp kiểm thử.
- 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
- 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
- 38.1CMakeLists cơ bản và targetproject, add_executable, add_library, và tư duy target.26 phút
- 38.2Build type, tùy chọn, phụ thuộcDebug và Release, option, compile_commands, FetchContent.28 phút
- 38.3Testing, cài đặt, và so với MakeCTest, install, và khi nào nên chọn CMake thay vì Make.26 phút
Phần 15
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.
- 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
Phần 16
Linux System Programming
Nói chuyện trực tiếp với hệ điều hành.
- 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
- 41.1File descriptor và open, read, writeMọi thứ là tệp, và bốn lời gọi vào ra tầng thấp.28 phút
- 41.2dup, dup2, và chuyển hướngCơ chế đằng sau chuyển hướng, và cách shell làm nó.24 phút
- 41.3Tầng thấp so với stdioopen read write so với fopen fread fwrite, và vai trò bộ đệm.26 phút
- 42.1Ranh giới user và kernel, errnoCổng giao tiếp duy nhất với nhân, và cách đọc lỗi.26 phút
- 42.2strace và chi phí syscallXem mọi syscall chương trình gọi, và vì sao stdio phải đệm.24 phút
- 42.3mmap, ánh xạ tệp vào bộ nhớTruy cập một tệp như một mảng, và khi nào nên dùng.26 phút
- 43.1pipe giữa cha và conIPC đơn giản nhất, và quy tắc sống còn: đóng đầu không dùng.26 phút
- 43.2Cài cmd1 nối cmd2Ghép hai lệnh bằng pipe và dup2, đúng cách shell làm.28 phút
- 43.3Named pipe và các cơ chế IPCFIFO giữa tiến trình bất kỳ, và bảng so sánh sáu cơ chế IPC.24 phút
- 44.1Tín hiệu và sigactionNgắt mềm không đồng bộ, và vì sao dùng sigaction thay signal.26 phút
- 44.2Quy tắc vàng viết handlerHandler chạy giữa chừng mọi thứ, nên chỉ được làm rất ít.26 phút
- 44.3kill và thoát sạchGửi tín hiệu, và cách tắt một chương trình một cách tử tế.24 phút
- 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
Phần 17
Network Programming bằng C
Viết được server và client TCP, UDP, hiểu socket API.
- 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
Phần 18
Embedded C
Nhánh chuyên sâu cho STM32, ESP32 và các vi điều khiển.
- 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
- 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
- 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
- 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
Phần 19
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.
- 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
- 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
- 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
- 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
- 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
Phần 20
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.
- 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
- 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
- 58.1Cảnh báo của trình biên dịchBộ cờ đầy đủ, và vì sao -Wall không phải là all.26 phút
- 58.2clang-tidy và cppcheckHai công cụ phân tích tĩnh, và cách đưa chúng vào dự án.28 phút
- 58.3Quy trình phân tích hoàn chỉnhNăm tầng công cụ, mỗi tầng bắt loại lỗi khác nhau.26 phút
- 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
Phần 21
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.
- 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