04/11/2018, 17:15

[C Extended] Dynamic Struct

Sơ lược về tạo struct động Trong C, tạo một struct sẽ như sau: struct { int i ; double d ; } name ; Nếu bạn biết libFFI (Foreign Function Interface) là gì thì chắc cũng hiểu được khái niệm tạo struct động như thế nào - tạo một struct thông qua việc cấp phát bộ nhớ động, ...

Sơ lược về tạo struct động

Trong C, tạo một struct sẽ như sau:

struct {
    int i;
    double d;
} name;

Nếu bạn biết libFFI (Foreign Function Interface) là gì thì chắc cũng hiểu được khái niệm tạo struct động như thế nào - tạo một struct thông qua việc cấp phát bộ nhớ động, không cần phải phai báo nó trong C (hiểu đơn giả là cấp phát động rồi gán giá trị vào đó).

Được lợi gì? Tất nhiên tạo struct động sẽ có rất nhiều cái lợi như dễ dàng tùy biến struct, không cần khai báo tĩnh,... nhưng phần lớn cái lợi sẽ dồn vào các ngôn ngữ thông dịch viết từ C/C++ hơn là ngôn ngữ C. Bản thân libFFI sinh ra cũng chỉ dành cho các ngôn ngữ kịch bản là chủ yếu mà.

Một lợi nhỏ là bạn sẽ đỡ tốn 4 byte cho một struct có element doube ở vị trí thứ hai, ta xét ví dụ sau:

typedef struct {int i; double d; unsigned u;} st1;
st1 x1 = { 4, 7.56, 12 };

typedef struct {int i; unsigned u; double d;} st2;
st2 x2 = { 4, 12, 7.56};

printf("st1: %d, %d, %d
", &x1.i, &x1.d, &x1.u);
printf("st2: %d, %d, %d
", &x2.i, &x2.u, &x2.d);
st1: 1000, 1008, 1016
st1: 2000, 2004, 2012

      - - - 4 - - - 8 - - - c - - - f - - - - - - - -
st1:   int  | _ _ _ |     double    | uint  | _ _ _ _
st2:   int  | uint  |     double    | _ _ empty _ _ _

Hai struct ở trên có thể xem là giống nhau, sizeof của chúng cùng là 16 byte, cùng gán giá trị như nhau. Tuy con số 4 byte này vô cũng nhỏ bé, nhưng sẽ là 1 vấn đề đối với người theo chủ nghĩa hoàn hảo, hãy hỏi compiler để nó trả lời về 4 byte đó.

Bên cạnh đó cũng có nhiều cái hại, chẳng hạn như cấp phát xong mà không dọn thỉ dễ dẫn đến tràn bộ nhớ hay thiếu sự tỉ mỉ dẫn đến call null pointer...

Khởi tạo struct động

Công việc đầu tiên chắc ai cũng làm được, đó là cấp phát bộ nhớ động cho struct.

void* st = calloc(1, x_size);

Mình khuyên không nên sử dụng malloc, bạn sẽ thấy rất nhiều trường hợp như tạo một mảng int* và thấy các phần tử mang giá trị khác không             </div>
            
            <div class=

0