1

请告诉我为什么以下代码甚至在 a 上运行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

4 回答 4

5

这称为可变长度数组,并受 C99 标准支持。
这在 C89 或任何版本的 C++ 中都不起作用。

于 2012-07-17T05:14:13.537 回答
3

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

我发现David Tribble 的这份清单很方便。它专注于 C++,但也为您提供了关于 C90 和 C99 之间差异的一个很好的概述。

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

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

于 2012-07-17T05:15:52.450 回答
2

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

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

于 2012-07-17T05:15:09.007 回答
1

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

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

于 2012-07-17T05:17:12.227 回答