Thứ Năm, 30 tháng 4, 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ảng 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 "khó nuốt" vì...đơn giản quá!
👉 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


FAQ
❓ 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 😏)