來源:https://www.cnblogs.com/qiuyuwutong/p/8708844.html
1、什么是柔性陣列?
柔性陣列既陣列大小待定的陣列, C語言中結構體的最后一個元素可以是大小未知的陣列,也就是所謂的0長度,所以我們可以用結構體來創建柔性陣列,
2、柔性陣列有什么用途 ?
它的主要用途是為了滿足需要變長度的結構體,為了解決使用陣列時記憶體的冗余和陣列的越界問題,
3、用法 :在一個結構體的最后 ,申明一個長度為空的陣列,就可以使得這個結構體是可變長的,對于編譯器來說,此時長度為0的陣列并不占用空間,因為陣列名
本身不占空間,它只是一個偏移量, 陣列名這個符號本身代 表了一個不可修改的地址常量 (注意:陣列名永遠都不會是指標! ),但對于這個陣列的大小,我們
可以進行動態分配,對于編譯器而言,陣列名僅僅是一個符號,它不會占用任何空間,它在結構體中,只是代表了一個偏移量,代表一個不可修改的地址常量!
//
柔性陣列在C99中的定義是:
6.7.2.1 Structure and union specifiers
As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member.
在至少兩個成員的結構體中,最后一個成員其型別若是不完整型別的陣列型別,則該成員稱為柔性陣列,
柔性陣列的特點:
柔性陣列作為不完整型別,即使用struct s test定義了變數test之后,sizeof (test.str)肯定是不行的,哪怕給str分配了空間也不行,
因為標準規定sizeof的運算元不可以是不完整型別(還有函式型別及位欄位),
所以sizeof (struct s)或sizeof (test),不算上柔性陣列str占的空間,也是情理之中了,(如果在GCC中,單獨測驗array[0],則顯示其占空間為0位元組)
簡而言之,柔性陣列只是把符號(名字)放在結構體內(壓根兒就沒定義),方便使用.或->語法來操作柔性陣列,其所占記憶體空間(定義時分配)并不算在結構體變數中,
有如下的Pascal字串:

1 //利用結構體讀取Pascal串 2 3 #include <stdlib.h> 4 #include <stdio.h> 5 6 struct StrPascal 7 { 8 unsigned short int nLength; 9 char string[0]; //結構體中柔性陣列10 };11 12 int main()13 {14 unsigned char PascalData[48] = {15 0x0C, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0D, 0x00,16 0x77, 0x77, 0x77, 0x2E, 0x70, 0x65, 0x64, 0x69, 0x79, 0x2E, 0x63, 0x6F, 0x6D, 0x04, 0x00, 0x6A,17 0x6A, 0x79, 0x79, 0x03, 0x00, 0x43, 0x2B, 0x2B, 0x06, 0x00, 0x62, 0x61, 0x63, 0x6B, 0x65, 0x7218 };19 20 struct StrPascal *pStrPascal = (struct StrPascal *)PascalData; //定義結構體指標,并賦值強轉后的陣列指標21 22 while ((int)pStrPascal < (int)PascalData + sizeof(PascalData)) //指標數值小于 原陣列首地址加總大小 則繼續23 {24 for (int i = 0; i < pStrPascal->nLength; i++) //按陣列中存放的字串長度輸出25 {26 putchar(pStrPascal->string[i]);27 }28 29 //指標重新賦值 當前指標地址 + 2個位元組(存盤字串長度所占用的記憶體空間) + 當前字串長度30 pStrPascal = (struct StrPascal *)((int)pStrPascal + sizeof(pStrPascal->nLength) + pStrPascal->nLength);31 puts("");32 }33 34 system("pause");35 return 0;36 }
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/69177.html
標籤:C
