GDB为什么无法准确判断出变长数组的类型的原因尚不清楚,但是作者猜测这和变长数组的动态特性有关,由于变长数组是在程序动态执行的过程生成的,GDB无法向对待常规数组一样从目标文件包含的.stabs节中获得长度信息,于是给出了错误的类型信息。
另外,作者对变长数组的作用域进��了测试,测试代码根据上例修改得到,如下所示:
1 int n;
2 char arr[n+1];
3
4 int
5 main(int argc, char *argv[])
6 {
7 int i;
8
9 n = atoi(argv[1]);
10 bzero(arr, (n+1) * sizeof(char));
11 for (i = 0; i < n; i++) {
12 arr[i] = (char)('A' + i);
13 }
14 arr[n] = '';
15 printf("%sn", arr);
16
17 return (0);
18 }
当如下编译的时候,gcc会提示出错:
[root@cyc test]# gcc -g dynarray.c
dynarray.c:2: variable-size type declared outside of any function
可见gcc不允许在文件域定义变长数组。
对于gcc中的变长数组能否用static修饰则使用如下代码进行测试:
1 int
2 main(int argc, char *argv[])
3 {
4 int i, n;
5
6 n = atoi(argv[1]);
7 static char arr[n+1];
8 bzero(arr, (n+1) * sizeof(char));
9 for (i = 0; i < n; i++) {
10 arr[i] = (char)('A' + i);
11 }
12 arr[n] = '';
13 printf("%sn", arr);
14
15 return (0);
16 }
当编译此源文件的时候,gcc给出如下错误提示:
[root@cyc test]# gcc -g dynarray.c
dynarray.c: In function `main':
dynarray.c:7: storage size of `arr' isn't constant
dynarray.c:7: size of variable `arr' is too large
根据提示,可知当数组用static修饰的时候,不能将其声明为变长数组。至于这里的提示说arr太大,作者猜测可能的原因是这样的:对于整数,gcc在编译期赋予了一个非常大的值,于是导致编译报错,不过这仅仅是猜测而已。
最后需要说明的是,作者是出于对gcc如何实现变长数组的方式感兴趣才进行上面的这些测试的。对于编程者来说,不用做这样的测试,也不需要知道变长数组是位于栈中还是其它地方,只要知道变长数组有上面这样一些限制就行了。另外,本文中有很多地方充斥着作者的推断和猜测。不过这并没有太大的关系,又不是写论文,谁在乎呢?
另外,上面的测试也说明了:尽管文献[2]没有像文献[1]中那样仔细说明变长数组的限制条件,但实际上它就是那样工作的。再一次体现出gcc的确很好地遵守了C标准的规定。
参考文献
[1] Samuel P. Harbison III, Guy L. Steele Jr.; C: A Reference Manual Fifth Edition; Prentice Hall, Pearson Education, Inc.; 2002
[2] Richard M. Stallman and the GCC Developer Community; Using the GNU Compiler Collection; FSF; May 2004