【C語言】柔性數組----可變長度的數組

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()函數進行內存的動態分配。並且分配的內存應大於結構的大小,以適應柔型數組的預期大小。
 

本文借鑑於:https://www.cnblogs.com/WindSun/p/11286141.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章