柔性陣列

lethe1203發表於2024-04-04
柔性陣列(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;
} 
執行結果如下:
0

相關文章