从何时开始使用可变长度数组?

时间:2012-07-17 05:12:24

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

请告诉我为什么以下代码甚至在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()这样的内存分配函数,但它是如何获取并输入整数并分配该大小的数组?

4 个答案:

答案 0 :(得分:5)

这被称为variable-length array,并受C99标准支持 这在C89或任何版本的C ++中都不起作用。

答案 1 :(得分:3)

实际上,此代码段中有两种机制在C90中是不允许的,但是在C99中。第一个是使用a[n]的可变大小数组声明。第二个是声明和代码的混合,a在一行代码之后声明。

我发现this list by David Tribble很方便。它主要围绕C ++,但也很好地概述了C90和C99之间的差异。

  

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

显然你已经知道,但无论如何值得一提:malloc()用于在堆上分配内存。示例中的数组是在堆栈上分配的,这是一种不同的机制。有关差异的详细解释,请参阅this answer

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

here是一个关于它解释更多

的艺术家