Thứ Sáu, 1 tháng 5, 2026

Stack vs Heap trong C – hiểu sai một ly, code đi một dặm

Trong lập trình C, có thể lúc này hay lúc khác bạn từng nghe qua 2 khái niệm:
  1. Stack
  2. Heap

Nghe thì rất "học thuật", rất "khoa học máy tính", rất "computer science", nhưng thực tế thì…
👉 90% người mới: đọc tài liệu xong, nghe thầy giản xong vẫn.... không hiểu gì 😅
Và nguy hiểm hơn:
👉 Hiểu mơ hồ, đọc qua vài tài liệu nhưng vẫn "lơ mơ" → code sai → dính bug → debug muốn "trầm cảm"


Stack và Heap là hai vùng bộ nhớ chính trong chương trình C.

Stack dùng cho biến cục bộ, cấp phát tự động
Heap dùng cho cấp phát động (malloc/free)

Hiểu rõ sự khác nhau giữa stack và heap sẽ giúp bạn tránh:
segmentation fault
memory leak
bug khó hiểu

Ví dụ trong đời sống hàng ngày (để không ngủ gật vì...học thuật cao siêu quá!)
Bạn tưởng tượng:
🧳 Stack = balo đeo sau lưng
Nhỏ gọn
Lấy ra nhanh
Dùng xong tự dọn
👉 Nhưng:
Không chứa được nhiều
Nhét quá → "toang" (stack overflow)

🏠 Heap = kho chứa đồ
Rộng rãi
Muốn để bao nhiêu cũng được
👉 Nhưng:
Bạn phải tự quản lý
Quên dọn → rác đầy (memory leak)
👉 Tóm lại:
Stack Heap
Nhanh Chậm hơn
Tự động Tự quản lý
Nhỏ Lớn
An toàn hơn Dễ lỗi hơn


Code minh họa (rất nên đọc kỹ)
📌 Stack
int main() {
    int x = 10; // nằm trên stack
}
👉 Khi hàm kết thúc:
x tự biến mất
bạn không cần làm gì

📌 Heap
#include <stdlib.h>
int main() {
    int *p = malloc(sizeof(int)); // heap
    *p = 10;
    free(p); // phải tự giải phóng
}
👉 Nếu bạn quên free:
→ memory leak 👻


Sự khác nhau quan trọng nhất (nhiều người không để ý)
🔥 1. Vòng đời (lifetime)
Stack: sống theo function
Heap: sống tới khi bạn free
👉 Đây là nguồn gốc của rất nhiều bug
🔥 2. Tốc độ
Stack: cực nhanh
Heap: chậm hơn (do phải xin OS)
👉 Nên:
dùng stack nếu có thể
chỉ dùng heap khi cần
🔥 3. Kích thước
Stack: giới hạn (~ vài MB)
Heap: lớn hơn nhiều
👉 Nếu bạn làm:
int arr[10000000]; // 💥
👉 Rất dễ:
→ stack overflow
🔥 4. Mức độ "nguy hiểm"
Stack: ít lỗi hơn
Heap: rất dễ gây:
memory leak
segmentation fault

Những lỗi "kinh điển" liên quan stack vs heap
❌ 1. Trả về biến stack
int* foo() {
    int x = 10;
    return &x; // 💀
}
👉 x nằm trên stack → ra khỏi hàm là "bay màu"
❌ 2. Dùng heap nhưng quên free
👉 Bạn đã gặp ở bài trước 😅
❌ 3. Stack overflow (đệ quy vô hạn)
👉 Gọi hàm mãi → stack đầy → crash
Chúng ta cần "thí nghiệm" để thấy kết quả
Bạn chạy code sau trên Online C Compiler :

#include <stdio.h>
void f() {
    int arr[1000000]; // stack lớn
    printf("Still running...\n");
    f();
}
int main() {
    f();
}

👉 Kết quả:
chạy vài lần
rồi… 💥 (xong phim :))


Khi nào dùng Stack, khi nào dùng Heap?
👉 Dùng Stack khi:
Biến nhỏ
Dùng trong function
Không cần tồn tại lâu
👉 Dùng Heap khi:
Dữ liệu lớn
Cần tồn tại lâu
Cần chia sẻ giữa nhiều function
Một quy tắc "sống còn"
Nếu bạn không chắc → dùng stack trước
Khi stack không đủ → mới dùng heap
Một sự thật hơi "đắng"
👉 Rất nhiều bug "khó hiểu" trong C:
segmentation fault
memory leak
👉 Đều bắt nguồn từ việc:
Không hiểu rõ stack vs heap
Tổng kết
Stack = nhanh, gọn, tự động
Heap = linh hoạt, nhưng nguy hiểm
👉 Hiểu được 2 cái này
→ bạn đã hơn 70% người mới học C



❓ Stack overflow là gì?
→ Khi stack dùng hết bộ nhớ
❓ Heap có bị overflow không?
→ Có, nhưng hiếm hơn
❓ Ngôn ngữ khác có stack/heap không?
→ Có, nhưng thường được quản lý tự động
👉 Bạn có thể cũng đang gặp:
Segmentation fault trong C là gì?
Con trỏ NULL nguy hiểm ra sao?
Memory leak là gì?
(👉 đã có ở các bài trước 😏)

Không có nhận xét nào:

Đăng nhận xét