刚才查了一下,你使用的应该是添加了C99编译开关的C编译器模式。在新的C99标准中,确实有允许你1楼代码那样的使用的方式,但有严格要求,即这个数组必须是局部作用域的,也就是说,它跟普通数组一样,是在栈中分配内存,只不过尺寸在运行时获得n后,把数组的指针尺寸作了相应的偏移(这要求实际的栈剩余足以满足分配要求,而且不能被背别的数据占据了扩展空间)。在C++编译器中,是没有这种用法的,我上面使用的正是C++编译器,所以即使是微软的VS2012也报错(我没试过用C模式,估计也没多少人有C++编译器不用而非要回归C编译器,哪怕是C程序)。C99的这种数组,他们称之为VLA。
C++支持的类似模式,也是char a[n],不过要求在发现这条语句之前,编译器能够计算得到n的确定大小,是在编译时确定的,不能在运行时确定。VLA放松了,能够用你1楼那样的方式在运行时再分配数组大小,一旦确定,就不能再更改,终归还是普通的数组。这种用法,限制多多,其实是鸡肋,没多大用处。毕竟栈的空间有限,而且假如函数使用变量的情况复杂,比如有多个类似这样的数组,到底在实现时如何确保每个VLA都可以满足需求,那就难说了,假如这是在递归环境中呢?据查到的信息,有人说这是GCC编译器的非标准扩展,在很早以前也有,那就不清楚了。但无论如何,测试结果如此,说明这种代码没多少可移植性,不用也罢。其实,在C中使用堆的功能很强大,用不着在栈中玩这种把戏,微软就算不支持这种东西,也是有道理的。
[
本帖最后由 TonyDeng 于 2012-11-3 01:10 编辑 ]