Code struct quản lý sinh viên bị Stack Overflow

Giúp em tại sao nó bị tràn thế ạ?
Cho em hỏi em sai chỗ nào vậy ạ. Em bí mấy tuần nay ._. . Cảm ơn mọi người.

#include<string>
#include<iostream>

using namespace std;
const int MAX = 500;
struct Sinhvien
{
	char MSSV[15];
	char HovaTenLot[30];
	char Ten[10];
	int gioitinh;
	int NamSinh;
	float DiemTrungBinh;
};
struct Lop
{
	int Siso;
	char TenLop[10];
	int Khoahoc;
	Sinhvien DSSV[100];
};
struct KHOA
{
	int LOP;
	Lop DSL[100];
};
void NhapSV(Sinhvien& sv)
{

	cout << "Nhap ma so sinh vien cua ban: ";
	fflush(stdin);
	cin.getline(sv.MSSV, 15);
	cout << "Nhap ho va ten lop cua ban: ";
	fflush(stdin);
	cin.getline(sv.HovaTenLot, 30);
	cout << "Nhap ten cua ban: ";
	fflush(stdin);
	cin.getline(sv.Ten, 10);
	cout << "Nhap gioi tinh cua ban (Nam=1,Nu=0): ";
	cin >> sv.gioitinh;
	cout << "Nhap nam sinh cua ban: ";
	cin >> sv.NamSinh;
	cout << "Nhap diem trung binh cua ban: ";
	cin >> sv.DiemTrungBinh;
	cin.ignore();
}
void XuatSV(Sinhvien sv)	
{
	cout << "---------------------------------------------";
	cout << "\nMa so sinh vien cua ban la: " << sv.MSSV;
	cout << "\nHo va ten lop cua ban la: " << sv.HovaTenLot;
	cout << "\nTen cua ban la: " << sv.Ten;
	cout << "\nGioi tinh cua ban la (Nam=1,Nu=0):" << sv.gioitinh;
	cout << "\nNam sinh cua ban la: " << sv.NamSinh;
	cout << "\nDiem trung binh cua ban la: " << sv.DiemTrungBinh;
}
/***************NHAP XUAT DSSV**************** ***/
void NhapDSSV(Lop& lop)
{
	
	cout << "\nNhap si so lop cua ban: ";
	cin >> lop.Siso;

	cout << "\nNhap ten lop cua ban: ";
	cin.ignore();
	cin.getline(lop.TenLop, 10);
	cout << "\nNhap khoa hoc cua ban: ";
	cin >> lop.Khoahoc;
	cin.ignore();
	for (int i = 1; i <= lop.Siso; i++)
	{
		system("cls");
		cout << "\nNhap thong tin sinh vien thu " << i << " : ";
		fflush(stdin);
		NhapSV(lop.DSSV[i]);
		
	}
}
void XuatDSSV(Lop lop)
{
	cout << "---------------------------------------------";
	cout << "\nSi so lop cua ban la: " << lop.Siso;
	cout << "\nTen lop cua ban la: " << lop.TenLop;
	cout << "\nKhoa hoc cua ban la: " << lop.Khoahoc;
	for (int i = 1; i <= lop.Siso; i++)
	{
		cout << "\nThong tin sinh vien thu " << i << " : ";
		XuatSV(lop.DSSV[i]);
	}

}/*************************NHAP XUAT LOP*/
void NhapKhoa(KHOA &khoa)
{
	cout << "\t\t\n\n**************KHOA CONG NGHE THONG TIN**************";
	cout << "\nNhap so luong lop trong khoa khoa: ";
	cin >> khoa.LOP;
	
	for (int i = 1; i < khoa.LOP; i++)
		{
			system("cls");
			cout << "\nNhap thong tin lop thu" << i << " : ";
			cin.ignore();
			NhapDSSV(khoa.DSL[i]);
		}
}

void XuatKhoa(KHOA khoa)
{

	cout << "-----------------------KHOA CONG NGHE THONG TIN----------------------";
	cout << "\nSo lop trong khoa CNTT " << khoa.LOP;
	for (int i = 1; i <= khoa.LOP; i++)
	{
		cout << "\nThong tin lop thu " << i << " : ";
		XuatDSSV(khoa.DSL[i]);

	}
}
void main()
{
	KHOA khoa;
	Sinhvien sv;
	Lop lop;
	//NhapSV(sv);
	//XuatSV(sv);
	//NhapDSSV(lop);
	//XuatDSSV(lop);
	NhapKhoa(khoa);
	XuatKhoa(khoa);
	system("pause");

}

Tràn cái gì thế ạ?

1 Like


e k rõ nửa ạ.

1 sinhvien là 68 bytes
1 lớp có 100 sinh viên + 20 bytes, vậy 1 lớp có 6820 bytes
1 khoa có 100 lớp, vậy + 4 bytes, vậy 1 khoa có 682004 bytes :V

hàm xuất khoa ko truyền khoa theo tham chiếu mà truyền copy, vậy là có thêm 1 khoa nữa trên stack, tổng cộng là 1364008 bytes trên stack :V Chắc stack 1MB nên bị tràn. Mà thông thường stack chứa được tới 2MB lận mà :V

có cái hằng số MAX = 500 ko xài, chắc em để MAX thay vì 100 nên nó mới tràn à? :V

6 Likes

em fix được rồi anh. cảm ơn anh

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?