柔性陣列(Flexible Array Member)是 C 語言中的一種特性,允許在結構體的末尾定義一個陣列,但是這個陣列的大小可以在執行時確定。柔性陣列通常用於動態分配記憶體,特別是在需要儲存可變數量元素的情況下非常有用。一般來說,柔性陣列的定義方式如下所示:
struct flex_array { int length; // 陣列長度 int data[]; // 柔性陣列,沒有指定大小 };
在這個結構體定義中,data[] 就是柔性陣列。注意它的宣告方式和普通陣列不同,沒有指定固定的大小。在使用柔性陣列時,我們需要額外考慮陣列的長度,通常會將陣列長度作為結構體的一個成員進行儲存,以便在執行時確定陣列的大小。
要注意的是,柔性陣列只能是結構體的最後一個成員,並且結構體必須至少有一個其他的成員。這是因為結構體的大小必須是確定的,而柔性陣列的大小是不確定的,所以需要其他的成員來確定結構體的大小。
使用柔性陣列時,通常需要透過動態記憶體分配函式(如 malloc、calloc 等)來為柔性陣列分配記憶體空間。例如:
int array_length = 5; size_t size = sizeof(struct flex_array) + sizeof(int) * array_length; struct flex_array *flex = malloc(size);
這樣就可以根據需要動態分配包含柔性陣列的記憶體空間了。在使用完柔性陣列後,記得透過 free() 函式釋放記憶體。
舉個例子:
#include <stdio.h> #include <stdlib.h> // 定義包含柔性陣列的結構體 struct flex_array { int length; int data[]; // 柔性陣列 }; int main() { int array_length = 5; // 計算結構體大小 size_t size = sizeof(struct flex_array) + sizeof(int) * array_length; // 分配記憶體 struct flex_array *flex = malloc(size); if (flex == NULL) { printf("記憶體分配失敗\n"); return 1; } // 設定資料 flex->length = array_length; for (int i = 0; i < array_length; i++) { flex->data[i] = i * 2; } // 列印資料 printf("柔性陣列大小:%ld\n", size); // int length:4Byte,int data[5]:20Byte,共24Byte printf("柔性陣列長度: %d\n", flex->length); printf("柔性陣列資料: "); for (int i = 0; i < flex->length; i++) { printf("%d ", flex->data[i]); } printf("\n"); // 釋放記憶體 free(flex); return 0; }
執行結果如下: