在哪个C标准版本中,可变长度数组不是语言的一部分,必需的或可选的?

时间:2019-04-15 20:20:57

标签: c

让我们考虑以下代码:

#include <stdio.h>

int main(){
    int size,i;
    scanf("%d",&size);
    int x[size];

    for(i=0;i<size;i++){
        x[i] = i;
    }

    for(i=0;i<size;i++){
        printf("%d\n", x[i]);
    }

    return 0;
}

我认为有些版本中我们无法使用变量定义数组的大小来声明数组,例如:

int x[size];

但是我不确定哪个版本。 所谓的ANSI C中允许这样做吗?

3 个答案:

答案 0 :(得分:6)

在C89 / C90中,即使将维度更改为编译时间常数,也无法交错声明和语句,例如将int x[size];声明(定义)放在scanf()之后。

在C89 / C90中,不能使用可变长度的数组-由于int x[size];不是编译时间常数,因此size的定义是不合法的。

要求C99编译器既支持函数(几乎)任意点的声明(它们仍然不能带有标签)和可变长度数组(VLA)定义。

C11编译器必须(几乎)在函数中的任何位置支持变量定义。 C11编译器可以选择支持VLA(§6.10.8.3 Conditional feature macros§6.7.6.2 Array declarators),如果不支持,则应定义__STDC_NO_VLA__

在本次讨论的所有方面,

C18等同于C11。

仅作记录:

  • C89是ANSI X3.159-1989
  • C90是ISO 9899-1990,其ANSI版本标记为“ ANSI X3.159-1989的修订和重新命名”。主要区别在于语言和库的章节号。
  • C99是ISO / IEC 9899:1999
  • C11是ISO / IEC 9899:2011
  • C18是ISO / IEC 9899:2018

当然,关于X3.159-1989的唯一不寻常的事情是,它是在有ISO标准之前由ANSI发布的。但是,ANSI以及其他国家标准机构(例如BSI(英国标准协会)和DIN(德国规范学会或德国标准化研究所))也都采用了每个后续的ISO标准。

1994年完成并于1995年发布的修正案1(针对ISO 9899:1990)也进行了修订。该修正案添加了标题,引入了有向图,并对其他内容进行了其他更改。几乎从来没有单独考虑过它,尤其是25年后的现在。

请注意,GCC将-ansi选项等同于-std=c90,这可能导致术语混淆。 ANSI比ISO早一年左右就发布了“ ANSI C标准”,但目的总是要有一个通用标准,并且ANSI在发布时就认可了ISO 9899:1990标准。

答案 1 :(得分:0)

在C99中添加了这种称为可变长度数组的数组。 请查看有关现代C编程的这篇不错的文章:

https://matt.sh/howto-c

答案 2 :(得分:-1)

ANSI-C(C89)不允许使用变量初始化数组。

例如:

  int x = 5;
  int ia[x];

以上示例是非法的。 ANSI-C将数组初始化大小限制为恒定。但是,您可以使用宏来定义数组的长度。

示例:

    #define MAX_ARRAY_SIZE 5
    int ia[MAX_ARRAY_SIZE];