【问题标题】:From when did C start using variable length arrays?C 从什么时候开始使用可变长度数组?
【发布时间】:2012-07-16 00:16:38
【问题描述】:

请告诉我为什么下面的代码甚至在strict C-99 compiler 上运行:

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    a[1]=10;
    a[2]=5;
    printf("%d %d",a[1],a[2]);
}

变量声明必须出现在 C 中的任何其他语句之前,对吧?如果我们想要一个动态分配的数组,我们必须使用像malloc() 这样的内存分配函数,但它是如何获取和输入整数并分配那个大小的数组呢?

【问题讨论】:

标签: c arrays memory-management dynamic-memory-allocation


【解决方案1】:

其实这段代码sn-p中有两种机制在C90中是不允许的,而在C99中是有的。第一个是可变大小数组声明,使用a[n]。二是声明与代码混合,a在一行代码之后声明。

我觉得this list by David Tribble 很方便。它以 C++ 为重点,但也为您提供了有关 C90 和 C99 之间差异的一个很好的概述。

如果我们想要一个动态分配的数组,我们必须使用内存 malloc() 等分配函数

显然你已经知道了,但还是值得一提:malloc() 用于在堆上分配内存。您示例中的数组是在堆栈上分配的,这是一种不同的机制。请参阅 this answer 以获得对差异的出色解释。

【讨论】:

  • 同意,我不太关心分配在哪里完成。我的问题是 C 标准允许的天气吗?
  • C99 可以。有关 C99 和 C90 的更多信息,请参阅here——我知道该页面主要是关于 C++,但也有关于 C 的很好的信息,以及在语言规范中查找的确切参考。
【解决方案2】:

C99 允许在您的示例中使用可变长度数组。

here 是一篇关于它的文章,解释更多

【讨论】:

    【解决方案3】:

    该功能称为variable length arrays,为了具体回答您的问题,它们是在 C99 标准中引入的(可能一些 C 编译器之前有它们,但任何符合 C99 的编译器必须有它们)。

    您会发现很多建议您不要使用它们的 SO 答案。使用malloc(),定义了内存分配失败的接口:调用返回NULL。使用 VLA,没有这样的接口:分配失败时会发生什么是未定义的行为。

    【讨论】:

      【解决方案4】:

      这称为variable-length array,受 C99 标准支持。
      这不适用于 C89 或任何版本的 C++。

      【讨论】:

      • 这也适用于普通的 C 编译器,但我认为原始 C 标准不允许它
      • @sasidhar:请定义“普通 C 编译器”。大多数 C 编译器默认不完全支持 any 语言标准;您通常必须添加额外的命令行参数。对于 gcc,-ansi -pedantic 使其非常符合 C89/C90;对于(几乎)C99 一致性,使用-std=c99 -pedantic
      • 对! C89/C90 要求所有变量声明都位于块的开头。这绝对是唯一有效的 C99 代码。
      • @Prashant:或者它可以利用特定于编译器的扩展;即使不在 C99 模式下,gcc 也支持混合声明和语句。
      • 如果“它”意味着使用非常量表达式来分配可变长度数组,那么没有。如果“它”意味着混合声明和声明,那么是的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2011-08-09
      • 2011-05-19
      • 2016-12-01
      • 2012-08-13
      • 2016-11-26
      • 2013-03-31
      相关资源
      最近更新 更多