C99中的變長陣列(VLA)

2022-02-08 04:02:16 字數 2012 閱讀 3768

處理二維陣列的函式有一處可能不太容易理解,陣列的行可以在函式呼叫的時候傳遞,但是陣列的列卻只能被預置在函式內部。例如下面這樣的定義:

#define cols 4

int sum3d(int ar[cols], int

rows)

現在假定了如下的陣列:

int array1[5][4

];int array2[100][4

];int array3[2][4];

可以使用下面的函式呼叫:

tot = sum2d(array1, 5

);tot = sum2d(array2, 100

);tot = sum2d(array3, 2);

這是因為行數可以傳遞給參量rows,而rows是乙個變數。但是如果要處理6行5列的陣列,則需要建立另乙個函式。

建立乙個處理任意的二維陣列也是有可能的,但是比較繁瑣。

正是以上原因,c99標準引入了變長陣列,它允許使用變數定義陣列各維,e.g.你可以使用下面的宣告:

int quarters = 4

;int regions = 5

;double sales[quarters][regions]; //

乙個變長陣列val

變長陣列有一些限制:變長陣列必須是自動儲存類的,意味著它們必須在函式內部或作為函式引數宣告,而且宣告時不可以進行初始化。

先看乙個簡單的例子,簡單的闡明如何編寫乙個計算任意二維int陣列的和的函式

int sum2d(int rows, int cols, int

ar[rows][cols]);

//rows, cols 要先於ar

c99標準規定,可以省略函式原型中的名稱,但是如果省略名稱,則需要用星號來代替省略的維數:

int sum2d(int , int, int ar[*][*]);
二維變長陣列測試**如下:

1 #include2

3#define rows 3

4#define cols 456

int sum2d(int rows, int cols, int

ar[rows][cols])716

17int

main()18,

22 ,

23

24};

2526

int morejunk[rows-1][cols+2] =,

28

29};

3031

int varr[rs][cs]; //

變長陣列

3233

for(i = 0; i < rs; i++)

34for(j = 0; j < cs; j++)

35 varr[i][j] = i * j +j;

36 printf("

3 * 5 array\n");

37 printf("

sum of all elemts = %d\n

",sum2d(rows, cols, junk));

3839 printf("

2 * 6 array\n");

40 printf("

sum of all elemts = %d\n

",sum2d(rows - 1, cols + 2

, morejunk));

4142 printf("

3 * 10 array\n");

43 printf("

sum of all elemts = %d\n

",sum2d(rs, cs, varr));

4445

return0;

46 }

c**

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

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

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

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

C99新增的柔性陣列

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