Bộ nhớ ngăn xếp và bộ nhớ heap
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 31 trên 63.
Khi chương trình C chạy, nó sử dụng hai vùng bộ nhớ riêng biệt: ngăn xếp và heap. Hiểu rõ sự khác nhau giữa hai vùng bộ nhớ này rất quan trọng để lập trình C hiệu quả, đặc biệt khi làm việc với con trỏ và cấp phát bộ nhớ động.
stack dùng để cấp phát bộ nhớ tĩnh. Đây là nơi lưu trữ các biến cục bộ, tham số của hàm và thông tin về lời gọi hàm. Hệ thống tự động quản lý stack: khi bạn khai báo một biến cục bộ, bộ nhớ sẽ được cấp phát trên stack; khi biến nằm ngoài phạm vi, bộ nhớ đó sẽ tự động được giải phóng.
void function() {
int x = 10; // Được cấp phát trên ngăn xếp
char arr[100]; // Cũng được cấp phát trên ngăn xếp
// Bộ nhớ tự động được giải phóng khi hàm kết thúc
}Heap được dùng để cấp phát bộ nhớ động. Đây là một vùng bộ nhớ lớn hơn mà bạn có thể yêu cầu trong khi chương trình chạy.
Khác với ngăn xếp, vùng nhớ heap cần được quản lý thủ công: bạn phải yêu cầu cấp phát bộ nhớ rõ ràng rồi giải phóng khi dùng xong. Cách này giúp bạn kiểm soát nhiều hơn nhưng cũng đi kèm với nhiều trách nhiệm hơn.
Điểm khác biệt chính nằm ở cách quản lý: bộ nhớ stack được quản lý tự động và có kích thước giới hạn, còn bộ nhớ heap được quản lý thủ công và lớn hơn nhiều. Trong các bài học tiếp theo, bạn sẽ học cách làm việc với bộ nhớ heap bằng các hàm như malloc() và free().
Tự làm thử
Bài học này không có thử thách code.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online