Trong đối tượng địa phương C hoặc C++ thường được phân bổ trên ngăn xếp. Bạn đang phân bổ một mảng lớn trên ngăn xếp, nhiều hơn ngăn xếp có thể xử lý, do đó bạn đang nhận được một số stackoverflow.
Không cấp phát cục bộ đó trên ngăn xếp, thay vào đó hãy sử dụng một số địa điểm khác. Điều này có thể đạt được bằng cách tạo đối tượng toàn cầu hoặc phân bổ nó trên toàn cầu heap. Biến toàn cầu là tốt, nếu bạn không sử dụng từ bất kỳ đơn vị biên dịch nào khác. Để đảm bảo điều này không xảy ra một cách tình cờ, hãy thêm một bộ lưu trữ tĩnh, nếu không thì chỉ cần sử dụng heap.
này sẽ phân bổ trong phân khúc BSS, mà là một phần của đống:
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
này sẽ phân bổ trong phân khúc DỮ LIỆU, mà là một phần của đống quá:
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
Điều này sẽ phân bổ tại một số vị trí không xác định trong heap:
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
Cảm ơn câu trả lời, nhưng bạn có thể giải thích cho tôi lý do mảng được cấp phát trên ngăn xếp và tại sao không nằm trong bộ nhớ chương trình chính. – Mayank
Mã đã cho phân bổ trên ngăn xếp vì nó được chỉ định dưới dạng một mảng với số lượng phần tử không đổi tại thời gian biên dịch. Giá trị chỉ được đặt trên heap với malloc, mới, vv –
Tất cả các biến tự động được phân bổ trên ngăn xếp. Nếu bạn nhìn vào disasseble bạn sẽ thấy kích thước của các biến địa phương của bạn trừ từ con trỏ ngăn xếp.Khi bạn gọi malloc hoặc calloc hoặc bất kỳ bộ nhớ fuctions các cuộc đấu giá đi và tìm khối của bộ nhớ đủ lớn để sataisfy reqest của bạn. – rerun