【发布时间】:2012-08-25 17:15:21
【问题描述】:
我对 C99 中的区别有点困惑:
int myfunc (int array[n], int n) { ... }
不会编译。据我所知,您必须始终将对数组大小的引用放在首位,因此必须这样写:
int myfunc (int n, int array[n]) { ... }
但如果你提供 static 关键字,这绝对没问题:
int myfunc (int array[static 1], int n) { ... }
这个顺序对我来说更可取,因为我习惯于在函数调用中将数组放在第一位,但为什么会这样呢?
编辑:意识到第三个示例实际上不是 VLA 有助于...
作为参考,这是我正在查看的导致问题的一段代码:
int sum_array(int n, int m, int a[n][m])
{
int i, j, sum = 0;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
sum += a[i][j];
return sum;
}
【问题讨论】:
-
你说的“这绝对没问题”是什么意思?为了用
static创建一个可比较的例子,你必须这样写int myfunc (int array[static n], int n)。由于同样的原因,它不会“正常工作”。您上一个示例“工作正常”,因为您将n替换为1。static与此无关。 -
它的工作方式与之前的定义完全相同(只要您切换函数参数,显然)——两者都将采用任意长度的数组并返回相同的结果。
-
int myfunc (int array[], int n)的工作方式与int myfunc (int array[static 1], int n)相同,只是在第一个原型中array参数不能是NULL。 -
@teppic:您的所有声明都将采用任意长度的数组(最后一个声明“不小于 1”)。但是,你又问为什么第三个声明是可能的。我不明白是什么引发了这个问题。为什么不呢?第三个声明中究竟有什么令您惊讶的地方?
-
@teppic 最后一种形式与 VLA 无关,它是作为实现的优化提示引入的,您可以将其与非可变长度数组一起使用。