【问题标题】:Declaring an array with a non-constant size variable [duplicate]声明具有非常量大小变量的数组
【发布时间】: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 是极其危险的,除非您已经对用作数组大小的表达式的值有一个非常小的界限。它们很容易导致堆栈溢出(不是好的类型 :-) 和堆内存的破坏。

标签: c arrays


【解决方案1】:

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

从某种角度来看,摘要告诉您的内容是真实的。 :-)

【讨论】:

  • 变长数组一开始让我很困惑,因为我记得以前用VC6.0学C的时候不支持。刚才我发现它在 Hackerrank.com 上的 InsertionSort 示例代码中使用。现在很清楚了。 Hackerrank采用gcc4.7.3,C99模式,完全支持此功能。
猜你喜欢
  • 2011-02-21
  • 2014-09-03
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
相关资源
最近更新 更多