Một cấu trúc với một thành viên mảng linh hoạt, rõ ràng, không có ý định khai báo, mà được sử dụng kết hợp với một con trỏ tới cấu trúc đó. Khi khai báo một thành viên mảng linh hoạt, phải có ít nhất một thành viên khác, và thành viên mảng linh hoạt phải là thành viên cuối cùng trong cấu trúc đó.Các thành viên mảng linh hoạt có thực sự cần thiết không?
Hãy nói rằng tôi có một mà trông như thế này:
struct example{
int n;
int flm[];
}
Sau đó, để sử dụng nó, tôi sẽ phải khai báo một con trỏ và sử dụng malloc để dành bộ nhớ cho nội dung của cấu trúc.
struct example *ptr = malloc(sizeof(struct example) + 5*sizeof(int));
Tức là, nếu tôi muốn mảng flm [] giữ năm số nguyên. Sau đó, tôi chỉ có thể sử dụng struct tôi như thế này:
ptr->flm[0] = 1;
Câu hỏi của tôi là, tôi không nên có thể chỉ cần sử dụng một con trỏ thay vì điều này? Nó không chỉ tương thích trước C99, nhưng tôi có thể sử dụng nó có hoặc không có con trỏ đến cấu trúc đó. Xem xét tôi đã phải sử dụng malloc với flm, tôi không nên chỉ có thể làm điều này?
Hãy xem xét định nghĩa mới này về cấu trúc ví dụ;
struct example{
int n;
int *notflm;
}
struct example test = {4, malloc(sizeof(int) * 5)};
Tôi thậm chí còn muốn có thể sử dụng thay thế cách tương tự như các thành viên mảng linh hoạt:
Sẽ điều này cũng làm việc? (Cung cấp định nghĩa ví dụ trên với notflm)
struct example test;
test.n = 4;
notflm = malloc(sizeof(int) * 5);
bản sao có thể có của [Thành viên mảng linh hoạt trong C - xấu?] (Http://stackoverflow.com/questions/246977/flexible-array-members-in-c-bad). Mảng linh hoạt là một phần của C99; con trỏ không và có thể có vấn đề về tính di động. –
Sự khác biệt chính là các thành viên mảng linh hoạt cho phép bạn phân bổ toàn bộ cấu trúc trong một khối liền kề. Nếu bạn muốn sao chép cấu trúc, chỉ cần tính toán kích thước của nó và làm một bản sao. Trong khi với một con trỏ, bạn phải sao chép cấu trúc, nhưng sau đó cũng sao chép mảng bên trong. –
@TedHopp theo cách có thể tưởng tượng nào bạn có thể nghiêm túc nói rằng con trỏ không phải là một phần của C99? –