Stack và heap dùng để lưu biến cục bộ và cấp phát động trong quá trình thực thi. Tuy nhiên, biến toàn cục (global variables) và cấu trúc dữ liệu toàn cục không nằm trên stack hay heap.
Vị trí bộ nhớ của biến toàn cục
- Được cấp phát trong khoảng bộ nhớ cố định (fixed memory block) – thường là segment
.data(đã khởi tạo) hoặc.bss(chưa khởi tạo/khởi tạo 0) của chương trình. - Kích thước và địa chỉ xác định tại compile-time / link-time, không thay đổi khi chạy.
- Tồn tại suốt vòng đời chương trình (từ khi load đến khi exit).
Ví dụ minh họa
int a[10]; // Biến toàn cục: nằm trong .data/.bss – cố định
int main() {
float *ptr = (float*)malloc(sizeof(float) * 10); // Cấp phát trên HEAP
// ...
free(ptr);
return 0;
}
Lưu ý: Code gốc có lỗi syntax sizeof(float)10.0 – đã sửa thành sizeof(float) * 10.
Tóm tắt phân vùng bộ nhớ
| Vùng nhớ | Chứa | Độ sống | Quản lý |
|---|---|---|---|
| Text/Code | Mã máy | Cả chương trình | Hệ điều hành |
| .data | Biến toàn cục/static đã khởi tạo ≠ 0 | Cả chương trình | Biên dịch viên |
| .bss | Biến toàn cục/static chưa khởi tạo hoặc = 0 | Cả chương trình | HĐH (zero-fill) |
| Stack | Biến cục bộ, tham số, địa chỉ trả về | Trong hàm | Tự động (LIFO) |
| Heap | Cấp phát động (new/malloc) | Tự do (new/delete) | Lập trình viên |
Lưu ý quan trọng
- Biến
staticcục bộ (trong hàm) cũng nằm trong.data/.bss, không phải stack. - Hằng số chuỗi literal (
"hello") thường nằm trong.rodata(read-only). - Tránh lạm dụng biến toàn cục – gây khó kiểm thử, xung đột tên, vấn đề thread-safety.