1、什麼是柔性數組?
柔性數組既數組大小待定的數組, C語言中結構體的最後一個元素可以是大小未知的數組,也就是所謂的0長度,所以我們可以用結構體來創建柔性數組。
2、柔性數組有什麼用途 ?
它的主要用途是爲了滿足需要變長度的結構體,爲了解決使用數組時內存的冗餘和數組的越界問題。
3、用法:在一個結構體的最後 ,申明一個長度爲空的數組,就可以使得這個結構體是可變長的。對於編譯器來說,此時長度爲0的數組並不佔用空間,因爲數組名
本身不佔空間,它只是一個偏移量, 數組名這個符號本身代 表了一個不可修改的地址常量 (注意:數組名永遠都不會是指針! )但對於這個數組的大小,我們可以進行動態分配,對於編譯器而言,數組名僅僅是一個符號,它不會佔用任何空間。
4、柔性數組用途
這樣的變長數組常用於網絡通信中構造不定長數據包,不會浪費空間浪費網絡流量,比如我要發送1024字節的數據,如果用定長包,假設定長包的長度爲2048,就會浪費1024個字節的空間,也會造成不必要的流量浪費。
其實柔性數組成員在實現跳躍表時有它特別的用法,在Redis的SDS數據結構中和跳躍表的實現上,也使用柔性數組成員。
例如:
typede struct test_data_msg{
int msg_data_len;
char arr[]; //可變數組 也可以寫成 char[0] .但是在賦值的時候一定要先申請空間,最後也要記住釋放這個空間。
};
測試代碼:
//test 柔性數組 : 可以將結構體的最後一個元素定義爲 一個柔性數組 即可變長度的數據,
//使用範圍:例如在網絡通信的時候,一般都無法確定data的真實長度 所以,通常把data定義爲柔性數組
typedef struct softarr_test{
int len;
int arr[0];
}softarr_test_t;
void softarr()
{
printf("sizeof(softarr_test_t) is %d",sizeof(softarr_test_t)); // 首先,柔性數組是不佔內存的。 對於編譯器來說,此時長度爲0的數組並不佔用空間,因爲數組名本身不佔空間,它只是一個偏移量, 數組名這個符號本身代 表了一個不可修改的地址常量
//我們如果要給這個柔性數組賦值,那就可以根據你要賦值的大小來給它增加長度
//例如:
int len = 10;
softarr_test_t *softarr = (softarr_test_t *)malloc(sizeof(softarr_test_t)+sizeof(int)*len);
int test_str[10] = {0,1,2,5,6,8,3,1,2,5};
int www;
for(www=0;www<len;www++){
softarr->arr[offset] = test_str[www];
offset++;
}
printf("softarr is:");
for(www=0;www<10;www++){
printf("%d",softarr->arr[www]);
}
}
關於柔性數組的幾點總結:
1、結構體中的最後一個元素允許是未知大小的數組,這就叫做柔型數組的成員。
2、結構體中的柔性數組成員前面必須至少包含一個其他成員。
3、柔型數組成員允許結構體中包含一個大小可變的數組,
4、柔型數組成員只作爲一個符號地址存在,而且必須是結構體最後一個成員。
5、Sizeof返回的這種結構體大小不包括柔性數組的內存,
6、柔型數組成員不僅可以用於字符數組,還可以是元素爲其他類型形的數組。
7、包含柔型數組成員的結構用malloc()函數進行內存的動態分配。並且分配的內存應大於結構的大小,以適應柔型數組的預期大小。