下面的代码片段在gcc中编译。但它不是正确的写作方式,因为它超过了malloc函数的使用。这段代码有什么问题?
#include<stdio.h>
main()
{
int n;
scanf("%d",&n);
int a[n];
}
答案 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的过时特性 - 隐含int
在main
的声明中,C99不再支持此声明。
您需要决定尝试使用哪种版本的C语言 - C89 / 90或C99。做出决定后,我们就能够讨论代码的正确性。