Tràn đống
Heap được sử dụng để lưu trữ các biến động. Nó là một vùng của bộ nhớ của quá trình. malloc (), calloc (), resize () tất cả các hàm có sẵn này thường được sử dụng để lưu trữ các biến động.
Tràn đống xảy ra khi -
A) Nếu chúng tôi phân bổ số lượng lớn các biến động -
int main() { float *ptr = (int *)malloc(sizeof(float)*1000000.0)); }
B) Nếu chúng ta liên tục cấp phát bộ nhớ và không giải phóng bộ nhớ sau khi sử dụng.
int main() { for (int i=0; i<100000000000; i++) { int *p = (int *)malloc(sizeof(int)); } }
Tràn ngăn xếp
Ngăn xếp là cấu trúc dữ liệu Cuối cùng trong Đầu ra. Nó được sử dụng để lưu trữ các biến cục bộ được sử dụng bên trong hàm. Các tham số được chuyển qua hàm này và địa chỉ trả về của chúng.
Nếu một chương trình sử dụng nhiều dung lượng bộ nhớ hơn, thì tràn ngăn xếp sẽ xảy ra do kích thước ngăn xếp bị giới hạn trong bộ nhớ máy tính.
Tràn ngăn xếp xảy ra khi
A) Nếu một hàm được gọi đệ quy với thời gian vô hạn thì ngăn xếp sẽ không thể lưu trữ số lượng lớn các biến cục bộ, do đó sẽ xảy ra tràn ngăn xếp -
void calculate(int a) { if (a== 0) return; a = 6; calculate(a); } int main() { int a = 5; calculate(a); }
B) Nếu chúng ta khai báo một số lượng lớn các biến cục bộ hoặc khai báo một mảng hoặc ma trận có chiều lớn có thể dẫn đến tràn ngăn xếp.
int main() { A[20000][20000]; }