C语言中可变修改的类型

时间:2014-05-07 21:46:05

标签: c

任何人都可以解释一下可变修改类型是什么吗?

  

如果我们在编译时有一个数组a[n]n未知,则a是一个VLA。给定一个数组b[c][d],其中cd在运行时暗示b是VLA之前是未知的,对吗?

在我的书中,他们说可变修改类型包含VLA。 而已;仅此而已。

如何创建指向可变修改类型的指针?

2 个答案:

答案 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/