使用非常量大小变量声明数组

7

我正在学习C语言考试,我在一些网站上下载了一份C语言总结。 上面写着不允许使用变量i来访问数组arr[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;

那么,关于数组声明的真相是什么呢? 谢谢!

作为警告:我建议不要太相信在互联网上找到的C语言摘要;最近我花了很多时间复习C和C++以准备面试,发现大部分互联网“学习指南”中都有不准确或误导性的信息。我建议使用一本好的入门书籍(https://dev59.com/DHRB5IYBdhLWcg3wpYqo),但需要注意的是,这样的书通常不涵盖C99的特性,因为它们不太常见。 - James McNellis
1
尽管在C99中它们是合法的,但除非您已经对将用作数组大小的表达式值有一个非常小的限制,否则可变长度数组非常危险。它们很容易导致堆栈溢出(不是好的那种:-)并破坏堆内存。 - R.. GitHub STOP HELPING ICE
1个回答

16
C99允许在堆栈上创建可变长度数组。您的编译器可能支持此功能。C89不支持此功能。
从某种角度来看,总结告诉了你真相。 :-)

变长数组一开始让我感到困惑,因为我记得在使用VC6.0学习C语言时不支持它。刚才我在Hackerrank.com的插入排序示例代码中发现它被使用了。现在我明白了。Hackerrank采用gcc4.7.3,C99模式,所以这个特性完全被支持。 - ChandlerQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接