30/09/2018, 23:51

Lỗi trong bài tập nhập thông tin Khoa và Sinh viên

Hi mọi người,

Hiện em đang làm 1 bài tập như sau: Nhập / Xuất N khoa, mỗi khoa gồm M sinh viên và mỗi sinh viên gồm các thông tin Mã số, Họ và tên, điểm Toán, Lý, Hóa.

Em dùng struct lồng nhau !

Source code:

source.cpp

#include "structure.h"
int main()
{
	KHOA *k = (KHOA *)malloc(sizeof(KHOA));
	NhapKhoa(k);
	XuatKhoa(k);
	free(k->sv->arr);
	free(k->sv);
	free(k);
	getch();
	return 0;
}

file.h

//#pragma once
#ifndef _structure_
#define _structure_
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


typedef struct stdinf STDINF;
struct stdinf
{
	char code[20];
	char name[30];
	double diemtoan;
	double diemly;
	double diemhoa;
};

typedef struct mangsv MANGSV;
struct mangsv
{
	int n;
	STDINF *arr;
};

typedef struct khoa KHOA;
struct khoa
{
	int soluongkhoa;
	MANGSV *sv;
};

void NhapThongTin(STDINF *);

void XuatThongTin(STDINF *);

void NhapMangSV(MANGSV *);

void XuatMangSV(MANGSV *);

void NhapKhoa(KHOA *);

void XuatKhoa(KHOA *);

#endif

file.cpp

#include "structure.h"

void NhapThongTin(STDINF *s)
{
	printf("
Nhap ma thi sinh: ");
	scanf("%s", s->code);
	printf("
Nhap ho va ten: ");
	while (getchar() != '
' && getchar() != EOF) {}
	gets_s(s->name);
	printf("
Nhap diem toan: ");
	scanf("%lf", &s->diemtoan);
	printf("
Nhap diem ly: ");
	scanf("%lf", &s->diemly);
	printf("
Nhap diem hoa: ");
	scanf("%lf", &s->diemhoa);
}
void XuatThongTin(STDINF *s)
{
	printf("
Ma thi sinh: %s
", s->code);
	printf("
Ho va ten: %s
", s->name);
	printf("
Diem toan: %.2lf
", s->diemtoan);
	printf("
Diem ly: %.2lf
", s->diemly);
	printf("
Diem hoa: %.2lf
", s->diemhoa);
}
void NhapMangSV(MANGSV *li)
{
	printf("
Nhap so luong sinh vien: ");
	scanf("%d", &li->n);
	li->arr = (STDINF *)malloc(li->n * sizeof(STDINF));
	for (int i = 0; i < li->n; ++i)
	{
		printf("
---------- NHAP VAO SINH VIEN %d ----------
", i + 1);
		NhapThongTin(&li->arr[i]);
	}
}
void XuatMangSV(MANGSV *li)
{
	for (int i = 0; i < li->n; ++i)
	{
		printf("
---------- THONG TIN SINH VIEN %d ----------
", i + 1);
		XuatThongTin(&li->arr[i]);
	}
}
void NhapKhoa(KHOA *k)
{
	printf("
Nhap so luong khoa: ");
	scanf("%d", &k->soluongkhoa);
	k->sv = (MANGSV *)malloc(sizeof(MANGSV));
	for (int i = 0; i < k->soluongkhoa; ++i)
	{
		printf("
---------- KHOA %d ----------
", i + 1);
		NhapMangSV(&k->sv[i]);
	}
}
void XuatKhoa(KHOA *k)
{
	for (int i = 0; i < k->soluongkhoa; ++i)
	{
		printf("
---------- THONG TIN KHOA %d ----------
", i + 1);
		XuatMangSV(&k->sv[i]);
	}
}

Khi build & run, code em hoàn toàn chạy bình thường, nhập / xuất ok nhưng khi nhập / xuất xong, nó hiện ra 1 cái bảng đẹp đẽ như bức hình dưới đây:

Em biết lỗi nằm ở hàm Main, ở 3 dòng giải phóng con trỏ. Em thử bỏ đi 2 dòng giải phóng đầu tiên thì ok, hết lỗi, nhưng để thì lại bị lỗi.

Vậy nên em nhờ mọi người giải thích giúp em vì sao lại bị lỗi như bức hình trên ở 3 dòng giải phóng trong hàm Main ạ ? Theo em nó là giải phóng những con trỏ bình thường mà sao lại có lỗi ?

Xin cảm ơn mọi người nhiều

*grab popcorn* viết 01:59 ngày 01/10/2018

Xem sơ qua code thấy malloc hơi sai.

k->sv = (MANGSV *)malloc(sizeof(MANGSV));

-> Chỉ cấp 1 ô nhớ có kích thước sizeof(MANGSV)
Mà ở đây bạn truy cập nhiều hơn 1 ~> pặc pặc.
Tương tự cho những chố khác (nếu có).

Sửa lại thành:

k->sv = (MANGSV *)malloc(sizeof(MANGSV) * k->soluongkhoa)
Người bí ẩn viết 01:56 ngày 01/10/2018

Ý em là ở chỗ giải phóng sao sai ấy anh ?

Chứ còn cái hàm malloc thì em thấy compile & run bình thường có sai đâu nhỉ

*grab popcorn* viết 02:03 ngày 01/10/2018

Thường cấp phát sai nó dẫn tới free bị lỗi.
Trước có lần mình cũng phát hiện chương trình tạch ở free, nhưng mò code phát hiện ra do cấp phát sai.

Mà search với tên lỗi: HEAP CORRUPTION DETECTED ra được nhiều kq với lý do tại sao đấy.

Bài liên quan
0