为什么以下代码使用Dev-C++编译器进行编译 不是用Visual Studio?
有什么想法吗?这是代码:
#include<stdio.h>
main(){
int n,i;
scanf("%d",&n);
int arr[n];
for(i= 0 ; i <n ; i++)
{
//Do something with the array
}
fflush(stdin);
getchar();
}
以下是错误:
答案 0 :(得分:6)
此:
int arr[n];
无效,因为n
不是常量表达式。您需要使用malloc
在堆上分配可变大小的数组(然后在完成free
时释放它们。)
如果您尝试使用.cpp
扩展程序对其进行编译,main
的返回类型必须为int
。如果您尝试使用.c
扩展名编译它,那么您需要使用c样式的局部变量声明并在函数顶部声明所有局部变量。
答案 1 :(得分:4)
Visual C ++不会使用该语法进行堆栈分配(尽管我希望它能做到)。您可以使用以下命令显式堆栈分配:
int *arr = (int *)_alloca(n*sizeof(*arr));
并且无需释放它,因为当范围结束时它会自动释放。
答案 2 :(得分:3)
这不是有效的C ++ - Visual C ++编译器不包含最新的C编译器(而不是C ++的C子集),特别是它不实现C99或任何更新的东西。您的代码使用Visual C ++编译器不知道的功能(int arr[n]
)。
答案 3 :(得分:1)
简化你得到的答案:
您的代码是C99,Visual C ++仅支持C89。帮自己一个忙,为Windows获得更好的编译器。英特尔编译器对C99的支持远远超过微软编译器(没有编译器)。
答案 4 :(得分:0)
您的计划不是符合标准的计划。
在尝试编译时,需要任何符合标准的编译器来发出诊断信息。
如果Dev-C ++在没有警告的情况下编译它,则在非合规模式下调用编译器。
除了必需的诊断之外,兼容的编译器可以尝试编译或者只是简单地中止编译。
main()
在C89中,这是有效的,不需要诊断,在C99中,这是无效的,需要诊断(有效的C99定义为int main(void)
或int main(int argc, char **argv)
或等效)...所以如果您使用的是兼容编译器它是一个C89编译器。
scanf("%d",&n);
int arr[n];
糟糕,这在C89中无效。在C89中,您不能将代码与声明混合在一起。 C89编译器在看到数组声明时必须发出诊断信息。
所以......你正在以不合规的方式使用你的编译器。没有办法说出为什么编译或编译失败。