1. 程式人生 > 其它 >C語言冷門之柔性陣列

C語言冷門之柔性陣列

技術標籤:C語言c語言

C語言冷門之柔性陣列

  1. 柔性陣列的概念
  2. 柔性陣列的特點
  3. 柔性陣列的使用
  4. 柔性陣列的優勢

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操作就可以釋放掉所有的記憶體。