0

为什么以下代码使用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();
}

以下是错误:

错误 http://img688.imageshack.us/img688/6618/26863513.jpg

4

5 回答 5

6

这个:

int arr[n];

无效,因为n不是常量表达式。您需要使用在堆上分配可变大小的数组malloc(然后在完成后释放它们free)。

如果您尝试使用.cpp扩展名编译它,main则返回类型必须为int. 如果您尝试使用.c扩展来编译它,那么您需要使用 c 样式的局部变量声明并在函数顶部声明所有局部变量。

于 2009-11-19T20:41:08.423 回答
4

Visual C++ 不使用该语法进行堆栈分配(尽管我希望这样做)。您可以通过以下方式显式进行堆栈分配:

int *arr = (int *)_alloca(n*sizeof(*arr));

并且不需要释放它,因为它会在作用域结束时自动释放。

于 2009-11-19T20:58:30.623 回答
3

这不是有效的 C++——Visual C++ 编译器包含最新的 C 编译器(而是 C++ 的 C 子集),特别是它没有实现 C99 或任何更新的东西。您的代码使用了 Visual C++ 编译器不知道的功能 ( int arr[n])。

于 2009-11-19T20:50:17.410 回答
1

为了简化您得到的答案:

您的代码是 C99,Visual C++ 仅支持 C89。帮自己一个忙,获得更好的 Windows 编译器。Intel 编译器对 C99 的支持比 Microsoft 编译器(没有)要好得多。

于 2009-11-20T08:36:22.490 回答
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 编译器在看到数组声明时必须发出诊断。

所以......您正在以不符合标准的方式使用您的编译器。没有办法告诉它为什么编译或编译失败。

于 2009-11-19T20:56:25.527 回答