任何人都可以解释一下可变修改类型是什么吗?
如果我们有一个数组
a[n]
,并n
在编译时是不知道,然后a
是VLA.给定一个数组b[c][d]
,其中c
并d
不会知道,直到运行时暗示b
是VLA,对不对?
在我的书中,他们说可变修改类型包含VLA.而已; 而已.
如何创建指向可变修改类型的指针?
可变修改类型是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])
{
...
}
Run Code Online (Sandbox Code Playgroud)
两个a
和b
是可变长度阵列.在C99之前,你不可能这样写some_function()
; 必须在编译时将数组的大小称为编译时常量.同样,another_function()
在C99之前,符号也不合法.
您可以,并且仍然可以(出于向后兼容性的原因,如果没有别的话)编写一个适度的模拟another_function()
:
enum { FIXED_SIZE = 32 };
void yet_another_function(int a[], int n, int b[][FIXED_SIZE], int c)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这不是一个完美的模拟,因为FIXED_SIZE是固定大小,但纯C99 VLA代码在那里有一个可变维度.因此,旧代码通常使用足够大的FIXED_SIZE来处理最坏的情况.
在里面another_function()
,名称a
和b
基本上是指向可变修改类型的指针.
否则,您执行的操作与固定大小的数组相同:
int z[FIXED_SIZE];
int (*z_pointer)[FIXED_SIZE] = &z;
int v[n];
int (*v_pointer)[n] = &v;
Run Code Online (Sandbox Code Playgroud)