2014-05-07 79 views
2

任何人都可以解釋什麼是可變修改類型?C語言中的可變修改類型

如果我們有一個數組a[n]n不是在編譯時已知然後a是VLA。給定一個數組b[c][d]其中cd直到運行時纔會知道暗示b是VLA,對不對?

在我的書中,他們表示,一個可變修改類型包含一個VLA。 就是這樣;而已。

如何創建指向可變修改類型的指針?

回答

6

可變修改類型是VLA(可變長度陣列)。在具有靈活數組成員的結構中有類似的類型,但我不打算進一步討論靈活的數組成員。

關於VLA的關鍵點是直到運行時才知道數組的維數。通常,在C89和標準之前,在編譯時除第一個數組外的所有維都必須是已知的常量值(並且第一維可以指定爲int a[]int b[][SIZE]int c[][SIZE1][SIZE2],其中大小是常數)。

void some_function(int n) 
{ 
    int a[n]; 
    int c = n+1; 
    int d = n+2; 
    int b[c][d]; 
    another_function(n, a, c, d, b); 
    ... 
} 

void another_function(int n, int a[n], int c, int d, int b[c][d]) 
{ 
    ... 
} 

ab都是可變長度數組。在C99之前,你不能寫這樣的some_function();數組的大小必須在編譯時被稱爲編譯時常量。同樣,在C99之前,another_function()的符號不會合法。

,你可以,而且還可以(向後兼容的原因,如果沒有別的)寫的another_function()溫和模擬:

enum { FIXED_SIZE = 32 }; 

void yet_another_function(int a[], int n, int b[][FIXED_SIZE], int c) 
{ 
    ... 
} 

這是不是一個完美的模擬,因爲FIXED_SIZE大小是固定的,但純粹的C99 VLA代碼在那裏具有可變維度。因此,舊代碼通常會使用足夠大的FIXED_SIZE來處理最壞的情況。

Inside another_function(),名稱ab基本上是指向可變更改類型的指針。

否則,你做一樣的一個固定大小的數組:

int z[FIXED_SIZE]; 
int (*z_pointer)[FIXED_SIZE] = &z; 

int v[n]; 
int (*v_pointer)[n] = &v; 
+1

具有柔性陣列構件的結構是不是一個可變類型。定義見N1570 6.7.6p3。 –

+1

好的;我沒有選中 - 修改以符合您的評論。謝謝! –

1

VLA ==可變長度數組

變長數組在C99規範引入允許這樣的事情:

int someArraySize; 
int myArray[someArraySize]; 

Variably Modified type是可變長度數組的類型。因此,可變修改類型包含VLA。在你的例子b [c] [d]的情況下,其中c和d在運行時間之前是未知的,b是可變修改類型,它恰好是一個可變長度多維數組。 b [c] [d]是一個可變長度數組的可變長度數組 - phew,多嘴。

這裏是一個偉大源我發現,描述了這些VLAS和可變類型與實例:

http://gustedt.wordpress.com/2011/01/09/dont-be-afraid-of-variably-modified-types/