Thắc mắc về malloc trong C

Hi mọi người hiện tại em đang học C về đang bí ở chỗ add và remove tên trong C. Mọi người có thể giúp em với được không ?
Em có cái file struct

struct LH{
              int mahocsinh;
              char  ten[100];
              char nganh[100];
              int tuoi;
}

Em muốn phương trình để add với remove học sinh trong lớp bằng cách sử dụng malloc với pointer thì phải làm sao?

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

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