C语言中可变修改的类型

use*_*699 2 c

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

如果我们有一个数组a[n],并n在编译时是不知道,然后a是VLA.给定一个数组b[c][d],其中cd不会知道,直到运行时暗示b是VLA,对不对?

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

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

Jon*_*ler 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])
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

两个ab是可变长度阵列.在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(),名称ab基本上是指向可变修改类型的指针.

否则,您执行的操作与固定大小的数组相同:

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

int v[n];
int (*v_pointer)[n] = &v;
Run Code Online (Sandbox Code Playgroud)

  • 具有灵活数组成员的结构不是可变修改类型。定义请参见 N1570 6.7.6p3。 (3认同)
  • 好的; 我没有检查 - 修改以匹配您的评论。谢谢! (2认同)