Lỗi: "CRT detected that the application wrote to memory after end of heap buffer."

Em mới học OOP (C++) :slight_smile: . và đang học về hàm dựng, nhưng khi build chạy chương trình thì bị lỗi như thế này.

đây là hàm constructor của em:

HocSinh()
{
	_maso = new char[7];
	strcpy(_maso, "0000000");

	_hoten = new char[50];
	strcpy(_hoten, "No name");

	_diachi = new char[100];
	strcpy(_diachi, "No adress");

	_diemtoan = _diemvan = 0.0;
}

và hàm ouput:

void HocSinh::Output()
{
	cout << "\nHo Ten: " << _hoten;
	cout << "\nMssv: " << _maso;
	cout << "\nDia chi: " << _diachi;
	cout << "\nDiem van: " << _diemvan;
	cout << "\nDiem Toan: " << _diemtoan;
}

Cho em hỏi là lỗi ở chỗ nào và sửa như thế nào ạ ? :smiley:

Hàm strcpy sẽ copy kèm theo kí tự null (\0) ở cuối chuỗi vào chuỗi đích, do đó cần tăng lượng kí tự từ 7 -> 8 để tránh tràn bộ nhớ. Hơn nữa chuỗi muốn in ra bằng “cout <<” thì chuỗi cũng cần có kí tự null ở cuối để xác định được điểm dừng nếu không sẽ đọc tràn ra ngoài vùng nhớ cần in.

Đây là thông tin về hàm strcpy:

char * strcpy ( char * destination, const char * source );

Copy string
Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).

To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.

Tham khảo:

2 Likes

:slight_smile: cảm ơn anh nhé… :slight_smile: tại trước đó ít xài tới hàm này nên không biết nhiều về nó :slight_smile:

:slight_smile: Còn mốt vấn đề nữa là hàm Input() của mình… :slight_smile: như thế này:

void HocSinh::Input()
{
	cout << "\nNhap vao ho ten sinh vien: ";
	gets(_maso);
	cout << "\nNhap vao ma so sinh vien: ";
	gets(_hoten);
	cout << "\nNhap vao dia chi: ";
	gets(_diachi);
	cout << "\nNhap vao diem van: ";
	cin >> _diemvan;
	cout << "\nNhap vao diem toan: ";
	cin >> _diemtoan;
}

mình Input() xong rồi xử dụng Output() thì nó lại bị lỗi y vậy :slight_smile:

hàm gets cũng nguy cơ lắm, vì nó không có giới hạn số lượng ký tự nhập vào. Dùng fgets đi

fgets (_maso, 7, stdin)

Tham khảo:

1 Like

:slight_smile: cảm ơn anh, em định dùng string cho bài này, cơ mà thầy lại không cho :’( bắt dùng char*

Dùng char mới hiểu được bản chất vấn đề chứ hehe

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