请告诉我为什么以下代码甚至在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()
这样的内存分配函数,但它是如何获取并输入整数并分配该大小的数组?
答案 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是一个关于它解释更多
的艺术家