C語言冷門之柔性陣列
阿新 • • 發佈:2020-12-09
C語言冷門之柔性陣列
- 柔性陣列的概念
- 柔性陣列的特點
- 柔性陣列的使用
- 柔性陣列的優勢
1. 柔性陣列的概念
柔性陣列是C語言中比較冷門的一個知識。在C99中,結構中的最後一個元素允許未知置大小的陣列,這就叫做柔性陣列的成員。需要注意的是,必須是最後一個成員。
typedef struct st
{
int i;
double j;
int a[0]; //柔性陣列成員
}type_a;
有些編譯器報錯,造成無法編譯的情況,可以改成:
typedef struct st
{
int i;
double j;
int a[ ]; //柔性陣列成員
}type_a;
2. 柔性陣列的特點
1.結構體中的柔性陣列成員前面必須至少有一個其他成員;
2. sizeof返回的這種結構大小不包括柔性陣列的記憶體;
int main()
{
typedef struct st_type
{
int i;
int a[ ];
}type_a;
printf("%d\n",sizeof(type_a));
return 0;
}
執行結果
3.包含柔性陣列成員的結構用malloc()函式進行記憶體的動態分配,並且分配的記憶體應該大於結構的大小,以適應柔性陣列的預期大小。
3. 柔性陣列的使用
1.malloc函式給包括柔性陣列成員的結構進行記憶體的動態分配
int i = 0;
//100*sizeof(int)就是給柔性陣列使用的
type_a *p = (type_a*)malloc(type_a) + 100*sizeof(int);
p -> i = 100;
for(i=0;i<100;i++)
{
p->a[i] = i;
}
free(p);
對於這樣的柔性陣列成員a,相當於獲得了100個整型元素的連續的地址空間。
2.結構體型別的柔性陣列
結構體型別是一個自定義型別,所以也可以作為型別來定義變數,因此在contact_t結構體中將最後一個元素定義為person_t結構體型別的柔性陣列。
//通訊錄
typedef struct person{
char name[SIZE/4]; //32位元組的名字
char sex;
int age;
char telephone[SIZE/4]; //32位元組的名字
char address[SIZE]; //128位元組的地址
}person_t; //給通訊錄成員結構體重新命名為person_t
typedef struct contact{
int cap; //總容量
int size; //當前位置
person_t persons[0]; //柔性陣列定義,方便新增成員
}contact_t; //將通訊錄結構體重新命名為contact_t
4. 柔性陣列的優勢
3.1提到的程式碼,也可以設計為:
typedef struct st_type
{
int i;
int *p_a;
}type_a;
type_a *p = malloc(sizeof(type_a));
p -> i = 100;
p -> p_a = (int *)malloc(p->i*sizeof(int));
for(i=0;i<100;i++)
{
p->p_a[i] = i;
}
//釋放空間
free(p->p_a);
p->p_a = NULL;
free(p);
p = NULL;
可以看出來3.1的程式碼和4的程式碼實現了相同的功能,但是3.1的程式碼版本明顯方便記憶體的釋放。如果把結構體的記憶體以及其成員要的記憶體一次性分配好,並返回給使用者一個結構體指標,使用者只需要做一次free操作就可以釋放掉所有的記憶體。