【发布时间】:2010-09-28 16:03:38
【问题描述】:
我正在为我的 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;
那么数组声明背后的真相是什么? 谢谢!
【问题讨论】:
-
作为警告:我建议不要太相信在 Internet 上找到的 C 的摘要;我最近花了很多时间复习 C 和 C++ 以准备面试,发现大多数互联网“学习指南”中都有不准确或误导性的信息。我推荐a good introductory book,但需要注意的是,此类书籍通常不涵盖 C99 功能,因为它们不太常见。
-
虽然它们在 C99 中是合法的,但 VLA 是极其危险的,除非您已经对用作数组大小的表达式的值有一个非常小的界限。它们很容易导致堆栈溢出(不是好的类型 :-) 和堆内存的破坏。