2010-09-28 182 views
5

我正在学习在C中进行测试,并且正在从某个站点下载的C小结中阅读。 这是写不允许写arr[i]其中i是一个变量。唯一的方法是使用malloc。
不过,我写了下面的代码,它编译没有警告,并没有在Valgrind的错误:声明一个非恒定大小变量的数组

int index = 5; 
int a4[index]; 

a4[0] = 1; 
a4[1] = 2; 

int index2; 
scanf("%d",&index2); 
int a5[index2]; 
a5[0] = 1; 
a5[1] = 2; 

那么,什么是落后数组声明的真相? 谢谢!

+0

作为警告:我会建议不要相信在互联网上发现的C的摘要太多;我最近花了很多时间在回顾C和C++的准备面试时发现,大多数互联网“学习指南”中都有不准确或误导性的信息。我会推荐[一本很好的入门书](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list),通常这类书不包括C99功能,因为它们不太常用。 – 2010-09-28 16:21:52

+1

虽然它们在C99中是合法的,但除非您已将表达式的值用作数组大小,否则VLA非常危险。他们可以很容易地导致堆栈溢出(不是那种好的:-)和堆内存的破坏。 – 2010-09-28 17:06:29

回答

14

C99允许在堆栈上创建variable length arrays。您的编译器可能支持此功能。该功能在C89中不可用。

从某个角度来看,总结告诉你的是真实的。 :-)

+0

可变长度数组首先让我感到困惑,因为我记得当我用VC6.0学习C时,它不被支持。刚才我发现它用在Hackerrank.com上的InsertionSort示例代码中。现在很明显。 Hackerrank采用gcc4.7.3,C99模式,因此完全支持此功能。 – ChandlerQ 2013-07-09 10:46:09