C中的动态数组声明

时间:2014-04-05 06:12:29

标签: c

下面的代码片段在gcc中编译。但它不是正确的写作方式,因为它超过了malloc函数的使用。这段代码有什么问题?

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

3 个答案:

答案 0 :(得分:5)

您的代码是合法的ISO C99代码。它不符合C89 ANSI标准:如果您遇到兼容性规则,由于旧的编译器或公司策略,您需要使用malloc()

更重要的是,在C99中,使用您的定义,数组在堆栈上分配,通常是有限的资源,而malloc()分配在< EM>堆

答案 1 :(得分:1)

您的数组是可变长度数组(VLA)。这是C的高级功能,在C99版标准中引入。

VLA的问题在于它们很容易溢出堆栈。除非您有特定原因要使用VLA,否则请使用malloc的动态内存,以避免堆栈溢出的风险。

您的主要声明是错误的。它应该是

int main(void)

答案 2 :(得分:0)

&#34; ...这不是正确的写作方式,因为它超过了malloc功能的使用......&#34; - 那应该是什么意思?根据现代C语言的规则,您的代码唯一的问题是int声明中缺少main。即它与任何malloc无关。

可以说你的代码在某种意义上是自相矛盾的,它使用了一个完全有效的C99特性 - 可变长度数组int a[n] - 但同时又依赖于C89 / 90的过时特性 - 隐含intmain的声明中,C99不再支持此声明。

您需要决定尝试使用哪种版本的C语言 - C89 / 90或C99。做出决定后,我们就能够讨论代码的正确性。