任何人都可以解释一下可变修改类型是什么吗?
如果我们在编译时有一个数组
a[n]
且n
未知,则a
是一个VLA。给定一个数组b[c][d]
,其中c
和d
在运行时暗示b
是VLA之前是未知的,对吗?
在我的书中,他们说可变修改类型包含VLA。 而已;仅此而已。
如何创建指向可变修改类型的指针?
答案 0 :(得分:6)
可变修改类型是VLA(可变长度数组)。在具有灵活阵列成员的结构中有类似的类型,但我不打算进一步讨论灵活的阵列成员。
关于VLA的关键点是,直到运行时才能知道数组的维数。经典地,在C89中和标准之前,除了第一个数组之外的所有维度在编译时都必须是已知的常量值(第一个维度可以指定为int a[]
或int b[][SIZE]
或{{ 1}}其中大小是常量)。
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])
{
...
}
和a
都是可变长度数组。在C99之前,你不可能像那样写b
;必须在编译时将数组的大小称为编译时常量。同样,some_function()
的符号在C99之前是不合法的。
您可以,并且仍然可以(出于向后兼容的原因,如果没有别的话)写出another_function()
的适度模拟:
another_function()
这不是一个完美的模拟,因为FIXED_SIZE是一个固定大小,但纯C99 VLA代码在那里有一个可变维度。因此,旧代码通常会使用足够大的FIXED_SIZE来处理最坏的情况。
在enum { FIXED_SIZE = 32 };
void yet_another_function(int a[], int n, int b[][FIXED_SIZE], int c)
{
...
}
内,名称another_function()
和a
基本上是指向可变修改类型的指针。
否则,您执行的操作与固定大小的数组相同:
b
答案 1 :(得分:1)
VLA ==可变长度数组
可变长度数组在C99规范中引入,允许这样的事情:
int someArraySize;
int myArray[someArraySize];
Variable Modified类型是可变长度数组的类型。因此,可变修饰类型包含VLA。对于b [c] [d]的例子,其中c和d直到运行时才知道,b是Variable Modified类型,恰好是可变长度多维数组。 b [c] [d]是一个可变长度数组的可变长度数组 - phew,真是满口。
我发现这是一个很好的来源,它描述了这些VLA和Variable Modified类型的例子:
http://gustedt.wordpress.com/2011/01/09/dont-be-afraid-of-variably-modified-types/