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() != '\n' && 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                            \n");
	printf("---------------------------------------------------------------------------\n");
	printf("|%5s|%-25s|%7s|\n", "MSSV", "Ho va ten", "Diem Tb");
	printf("---------------------------------------------------------------------------\n");
	for (int i = 0; i < *n; i++)
	{
		printf("|%5d|%-25s|%7.2f|\n", hs[i].id, hs[i].name, hs[i].p);
		printf("---------------------------------------------------------------------------\n");
	}
}
int main()
{
	hocsinh *hs;
	int n;
	hs = (hocsinh*)malloc(sizeof(hocsinh));
	Nhap(hs, &n);
	Xuat(hs, &n);
	free(hs);
	_getch();
	return 0;
}

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

1 Like

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

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.

1 Like

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

hs = (hocsinh*)realloc(hs, i * sizeof(hocsinh));

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

1 Like

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à

lúc thêm n thì cũng không cần con trỏ lam dau

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