什麼是柔性陣列
柔性陣列也稱為變長陣列,是一種動態陣列的實現方式。
與普通陣列不同的是,柔性陣列在定義時不需要明確指定陣列大小,在程式執行時可以動態地分配和擴充套件陣列大小,在程式執行時可以動態地分配和擴充套件陣列大小
柔性陣列是透過C99標準中提供的結構體成員為未知長度的陣列的特性來實現的,它需要一個結構體作為陣列的容器,並在結構體定義中,最後一個陣列成員不指定長度如:
struct tagPascalString
{
short int length;
char data[0];
};
柔性陣列的特點
- 結構體中的柔性陣列前面必須至少一個其他成員。
- sizeof返回的這種結構大小不包括柔性陣列的記憶體。
- 包含柔性陣列成員的結構用malloc()函式進行記憶體的動態分配,並且分配的記憶體應該大於結構的大小,以適應柔性陣列的預期大小。
柔性陣列的使用
使用柔性陣列時,我們需要手動分配記憶體空間,並且調整陣列的大小。例如,可以使用malloc函式分配記憶體空間,並且根據實際需要調整陣列的大小。
struct S
{
char c;
int i;
int arr[];//未知大小的陣列-柔性陣列
};
int main()
{
struct S *ps = (struct S*)malloc(sizeof(struct S)+20);
//檢查是否分配成功
if(ps==NULL)
{
return 0;
}
int i =0;
ps->i = 100;
for(i = 0; i<100;i++)
{
ps_=->arr[i] = i;
}
for(i = 0;i<100;i++)
{
printf("%d",ps->arr[i]);
}
//釋放掉申請好的空間
free(ps);
//最後將ps置為空 避免出現野指標情況
ps = NULL;
return 0;
}
4.柔性陣列與其他對比優勢
struct S
{
char c;
int i;
int* data;
};
int main()
{
struct S *ps = (struct S*)malloc(sizeof(struct S));
if(ps == NULL)
{
return 0;
}
ps->c = 'w';
ps->i = 100;
ps->data = (int*)malloc(20);
if(ps->data == NULL)
{
return 0;
}
int i = 0;
for(i = 0; i<5;i++)
{
ps->data[i] = i;
}
for(i = 0; i<5;i++)
{
printf("%d ",ps->data[i]);
}
//空間不夠了進行增容
int *ptr = (int *)realloc(ps->data,40);
if(ptr == NULL)
{
return 0;
}
else
{
ps->data = ptr;
}
//增容成功就是用
//
//釋放時應該遵循的條件先申請的後釋放
//釋放
free(ps->data);
ps->data = NULL;
free(ps);
ps = NULL;
return 0;
}
兩個程式可以完成同樣的功能,但是之前的程式有兩個優點:
- 1.方便記憶體釋放。如果我們的程式碼是在一個給別人用的函式中,你在裡面做了二次記憶體分配,並把整個結構體返回給使用者。使用者呼叫free可以釋放結構體,但是使用者並不知道這個結構體內的成員也需要free,所以你不能指望使用者發現這個事。所以,如果我們把結構體的記憶體以及其成員瑤的記憶體一次性分配好了,並返回給使用者一個結構體指標,使用者做一次free就可以把所有的的記憶體也給釋放掉。
- 2.有利於訪問速度。連續的記憶體有益於提高訪問速度,也有益於減少記憶體碎片。