C语言中的可变修改类型
有人能解释什么是可变修改类型吗 如果我们有一个数组C语言中的可变修改类型,c,C,有人能解释什么是可变修改类型吗 如果我们有一个数组a[n]并且n在编译时是未知的,那么a就是VLA。给定一个数组b[c][d]其中c和d直到运行时才知道b是VLA,对吗 在我的书中,他们说可变修改类型包含VLA。 就这样,;没别的了 如何创建指向可变修改类型的指针?可变修改类型是VLA(可变长度数组)。在具有灵活数组成员的结构中也有类似的类型,但我不打算进一步讨论灵活数组成员 关于VLA的关键点是数组的维数在运行时之前是未知的。通常,在C89和标准之前,数组的所有维度(除第一个维度外)在编译时都
a[n]
并且n
在编译时是未知的,那么a
就是VLA。给定一个数组b[c][d]
其中c
和d
直到运行时才知道b
是VLA,对吗
在我的书中,他们说可变修改类型包含VLA。
就这样,;没别的了
如何创建指向可变修改类型的指针?可变修改类型是VLA(可变长度数组)。在具有灵活数组成员的结构中也有类似的类型,但我不打算进一步讨论灵活数组成员 关于VLA的关键点是数组的维数在运行时之前是未知的。通常,在C89和标准之前,数组的所有维度(除第一个维度外)在编译时都必须是已知的常量值(第一个维度可以指定为
inta[]
或intb[][SIZE]
或intc[][SIZE1][SIZE2]
,其中大小是常量)
a
和b
都是可变长度数组。在C99之前,您不可能编写像这样的函数();数组的大小必须在编译时作为编译时常量来知道。同样,在C99之前,另一个函数()
的符号也不合法
您可以,而且仍然可以(出于向后兼容性的原因,如果没有其他原因的话)编写另一个函数()的适度模拟:
这不是一个完美的模拟,因为FIXED_大小是一个固定大小,但是纯C99 VLA代码有一个可变的维度。因此,旧代码通常会使用一个固定的大小,这个大小对于最坏的情况来说是足够大的
在other_function()
中,名称a
和b
基本上是指向可变修改类型的指针
否则,执行的操作与固定大小数组相同:
int z[FIXED_SIZE];
int (*z_pointer)[FIXED_SIZE] = &z;
int v[n];
int (*v_pointer)[n] = &v;
VLA==可变长度数组
C99规范中引入了可变长度阵列,以实现以下功能:
int someArraySize;
int myArray[someArraySize];
可变修改类型是可变长度数组的类型。因此,可变修改类型包含VLA。在b[c][d]的例子中,c和d直到运行时才知道,b是一个可变修改的类型,恰好是一个可变长度的多维数组。b[c][d]是一个可变长度数组的可变长度数组——哎哟,真是太多了
以下是我发现的一个很好的来源,它通过示例描述了这些VLA和可变修改类型:
具有灵活阵列成员的结构不是可变修改类型。定义见N1570 6.7.6p3.OK;我没有检查--修改以匹配您的评论。谢谢
int z[FIXED_SIZE];
int (*z_pointer)[FIXED_SIZE] = &z;
int v[n];
int (*v_pointer)[n] = &v;
int someArraySize;
int myArray[someArraySize];