c99變長陣列 c語言程式設計之可變長陣列

2021-10-13 05:01:16 字數 639 閱讀 4227

是不是看著標題進來了,認為自己看錯了?因為平常我們c程式設計的時候資料長度都是固定好的,沒有聽說過c還能實現變長陣列??不過你沒看錯,c99中確實是有柔性陣列的概念,也就是可變長陣列,c99中允許結構體中的最後乙個成員是長度未知的陣列,其定義格式如下:

typedef struct

int a;

char data;

}st,*pst;

有的編譯器上述定義會報錯,可以寫成以下方式:

typedefstruct

int a;

char data[0];

}st,*pst;

先猜猜這個結構體的實際大小是多少??大家可以自己試一下,用sizeof(st)測試一下這個結構體的實際大小,結果是4,很顯然data並沒有占用實際記憶體,這樣就成功定義了乙個柔性陣列,那麼我們如何使用呢?

下面就要用到動態記憶體分配函式了:使用方式如下:

*pst gpst = (*pst)malloc(sizeof(st)+n);

n就是data陣列的長度,當然了,使用完畢記得釋放記憶體。

free(gpst);

gpst = null;

typedef struct

int a;

char *data;

}st,*pst;

c99變長陣列 第九章 C99可變長陣列VLA詳解

c90及c 的陣列物件定義是靜態聯編的,在編譯期就必須給定物件的完整資訊。但在程式設計過程中,我們常常遇到需要根據上下文環境來定義陣列的情況,在執行期才能確知陣列的長度。對於這種情況,c90及c 沒有什麼很好的辦法去解決 stl的方法除外 只能在堆中建立乙個記憶體映像與需求陣列一樣的替代品,這種替代...

C99中的變長陣列(VLA)

處理二維陣列的函式有一處可能不太容易理解,陣列的行可以在函式呼叫的時候傳遞,但是陣列的列卻只能被預置在函式內部。例如下面這樣的定義 define cols 4 int sum3d int ar cols int rows 現在假定了如下的陣列 int array1 5 4 int array2 10...

C99新增的柔性陣列

我總結了一下用指標和用變長結構體的區別 1.在位置方面 指標可以放在任何地方,但是變長結構體的變長部分一定要放在結構體的最後。2.在記憶體占用方面 指標會佔乙個指標的大小的記憶體空間,但是變長陣列是不佔記憶體的,它只是乙個佔位符。3.在記憶體布局方面 指標指向的記憶體和結構體的記憶體可以是不連續的,...