Dùng malloc() để tạo LH thì bạn phải tính kích thước từng field trong LH rồi cộng hết lại sẽ có kích thước cần allocate.
N = 100
size_t size_ma = sizeof(int);
size_t size_tuoi = sizeof(int);
size_t size_ten = N * sizeof(char);
size_t size_nganh = N * sizeof(char);
LH *lh = (LH *) malloc(size_ma + size_tuoi + size_ten + size_nganh);
Nếu đã quen thì không cần phải liệt kê ra riêng từng biến nữa:
LH *lh = (LH *) malloc(
(2 * sizeof(int)) +
(2 * N * sizeof(char))
);
Kết quả:
LH *LH_new(int ma, int tuoi, const char *ten, const char *nganh)
{
LH *lh = (LH *) malloc(
(2 * sizeof(int)) +
(2 * N * sizeof(char))
);
lh->ma = ma;
lh->tuoi = tuoi;
if (NULL != ten && strlen(ten) <= N)
strcpy(lh->ten, ten);
if (NULL != nganh && strlen(nganh) <= N)
strcpy(lh->nganh, nganh);
return lh;
}
Khi free thì free như bình thường, nhưng nếu có field nào là pointer thì free nó trước.
void LH_free(LH *lh)
{
if (NULL != lh)
{
/* free() hết pointers con trong struct, nếu có, sau đó free() struct */
free(lh);
lh = NULL;
}
}
Cách dùng
LH *sv1 = LH_new(666, 42, "Nguyen Van A", "Vat lieu");
printf("Ten: %s; nganh: %s", sv1->ten, sv1->nganh);
strcpy(sv1->ten, "Huynh Hong B");
printf("Ten moi: %s", sv1->ten);
...
LH_free(sv1);
P/s. trong LH_new(), vì malloc() lấy bộ nhớ trên heap, không phải stack nên có thể trả về để dùng ở global scope được