01/10/2018, 15:21

Xin trợ giúp cấp phát động mảng cấu trúc trong C

Chào mọi người, mình vừa học C được vài tháng. Có một bài tập là tạo một danh sách sinh viên bằng con trỏ cấp phát động. Code của mình khi nhập người thứ nhất thì bình thường nhưng khi nhập người thứ 2 thì nó báo lỗi ở dòng realloc… mình không sửa được chỗ đó, các bạn giúp mình với.

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
typedef struct
{
	int id;
	char name[50];
	float p;
}hocsinh;
//Ham nhap du lieu sinh vien
void Nhap(hocsinh *hs, int *n)
{
	int ms = 0;
	int i = 0;
	while (ms != -1)
	{
		printf("Nhap vao MSSV. Nhap -1 de ket thuc: ");
		scanf_s("%d", &ms);
		if (ms != -1)
		{
			hs[i].id = ms;
			while (getchar() != '
' && getchar() != EOF) {}
			printf("Ho va ten: ");
			gets_s((hs[i].name));
			printf("Diem Trung Binh: ");
			scanf_s("%f", &hs[i].p);
			i++;
			realloc(hs, sizeof(hocsinh) * (i+1));
		}
	}
	*n = i;
}
void Xuat(hocsinh *hs, int *n)
{
	printf("                            Thong Tin Sinh Vien                            
");
	printf("---------------------------------------------------------------------------
");
	printf("|%5s|%-25s|%7s|
", "MSSV", "Ho va ten", "Diem Tb");
	printf("---------------------------------------------------------------------------
");
	for (int i = 0; i < *n; i++)
	{
		printf("|%5d|%-25s|%7.2f|
", hs[i].id, hs[i].name, hs[i].p);
		printf("---------------------------------------------------------------------------
");
	}
}
int main()
{
	hocsinh *hs;
	int n;
	hs = (hocsinh*)malloc(sizeof(hocsinh));
	Nhap(hs, &n);
	Xuat(hs, &n);
	free(hs);
	_getch();
	return 0;
}
rogp10 viết 17:34 ngày 01/10/2018

Hàm realloc có giá trị trả về là có lí do http://en.cppreference.com/w/c/memory/realloc để ý ptr chỉ là trỏ cấp 1 thôi.

Gấu Lớn viết 17:31 ngày 01/10/2018

Là sao bạn? Mình chưa hiểu lắm

rogp10 viết 17:37 ngày 01/10/2018

Khi cần một vùng nhớ lớn hơn qua realloc thì sẽ có khả năng vùng nhớ cũ ko thể mở rộng nữa và phải thay thế, lúc này realloc sẽ trả về một vùng nhớ khác. Bạn phải sử dụng con trỏ được trả về này.

Gấu Lớn viết 17:24 ngày 01/10/2018

mình sửa lại như vầy nó vẫn báo lỗi

hs = (hocsinh*)realloc(hs, i * sizeof(hocsinh));
rogp10 viết 17:23 ngày 01/10/2018

Thiếu <stdlib> rồi. Vả lại không cần ép kiểu cho malloc calloc realloc.

Gấu Lớn viết 17:21 ngày 01/10/2018

trên visual không ép kiểu nó báo lỗi bạn ơi, với lại mình có <malloc.h> rồi mà

Bài liên quan
0