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
Xem sơ qua code thấy malloc hơi sai.
-> 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:
Ý 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ỉ
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.