01/10/2018, 17:44

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?

Florastamine viết 19:52 ngày 01/10/2018

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

Bài liên quan
0