C语言变长数组之剖析(3)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/429f5a27fd386b06c2f86732aa963224.html