30/09/2018, 18:18

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

Em mới học OOP (C++) . 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 << "
Ho Ten: " << _hoten;
	cout << "
Mssv: " << _maso;
	cout << "
Dia chi: " << _diachi;
	cout << "
Diem van: " << _diemvan;
	cout << "
Diem Toan: " << _diemtoan;
}

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

Tran Huan viết 20:23 ngày 30/09/2018

_maso = new char[7];
strcpy(_maso, “0000000”);

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:

  • http://www.cplusplus.com/reference/cstring/strcpy/
Trịnh Minh Cường viết 20:28 ngày 30/09/2018

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

Trịnh Minh Cường viết 20:33 ngày 30/09/2018

Còn mốt vấn đề nữa là hàm Input() của mình… 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

Mai Anh Dũng viết 20:30 ngày 30/09/2018

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:

Từ bài @nhatlonggunz hỏi ở đây [Video] Ngôn Ngữ C - 24 - Hàm nhập vào từ bàn phím, scanf: Đạt đã trả lời ở đây Nhưng mà Đạt chưa hướng dẫn cách sử dụng hàm fgets một cách chi tiết. Nhiều bạn mới học hay dùng scanf để nhập chuỗi. Nhưng đó không phải là cách đúng để nhập chuỗi. Có bạn nào có thể giúp mình giải thích cách sử dụng hàm fgets không?
Trịnh Minh Cường viết 20:30 ngày 30/09/2018

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*

Mai Anh Dũng viết 20:29 ngày 30/09/2018

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

Bài liên quan
0