为什么';Visual Studio C编译器不是这样的吗?

为什么';Visual Studio C编译器不是这样的吗?,c,visual-studio,compiler-construction,c99,C,Visual Studio,Compiler Construction,C99,以下代码在Linux上使用gcc-std=c99可以很好地编译,但在Visual Studio 2010 C编译器上会出现以下错误: Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. fib.c fib.c(42) : error C2057: expected con

以下代码在Linux上使用gcc-std=c99可以很好地编译,但在Visual Studio 2010 C编译器上会出现以下错误:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. fib.c fib.c(42) : error C2057: expected constant expression fib.c(42) : error C2466: cannot allocate an array of constant size 0 fib.c(42) : error C2133: 'num' : unknown size 适用于80x86的Microsoft(R)32位C/C++优化编译器版本16.00.40219.01 版权所有(C)微软公司。版权所有。 纤维蛋白c fib.c(42):错误C2057:预期的常量表达式 fib.c(42):错误C2466:无法分配大小为0的常量数组 fib.c(42):错误C2133:“num”:未知大小 用户输入要生成的斐波那契数的数量。我很好奇为什么微软编译器不喜欢这段代码

#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

void fib(int max);

int main(int argc, char *argv[])
{    
    int argument;

    if (argc != 2)
    {
        puts("You must supply exactly one command line argument.");
        return 0;
    }

    argument = atoi(argv[1]);

    if (argument == 0)
    {
        puts("You gave us 0 or an invalid integer.");
        return 0;
    }
    else if (argument < 0)
    {
        puts("You gave us a negative integer.");
        return 0;
    }
    else if (argument == INT_MAX)
    {
        puts("You gave us a number that's too big to fit in an integer.");
        return 0;
    }

    printf("%d\n", argument);
    fib(argument);
    return 0;
}

void fib(int max)
{
    int num[max]; /// <- Line 42

    int i;
    for (i = 0; i < max; i++)
    {    
        if (i == 0)
            num[i] = 0;
        else if (i == 1)
            num[i] = 1;
        else
            num[i] = num[i-1] + num[i-2];

        printf("%d\t%d\n", i, num[i]);
    }
}
#包括
#包括
#包括
空隙纤维(int-max);
int main(int argc,char*argv[])
{    
整型参数;
如果(argc!=2)
{
puts(“必须只提供一个命令行参数。”);
返回0;
}
参数=atoi(argv[1]);
if(参数==0)
{
puts(“您给了我们0或一个无效的整数。”);
返回0;
}
else if(参数<0)
{
puts(“您给了我们一个负整数。”);
返回0;
}
else if(参数==INT_MAX)
{
puts(“您给我们的数字太大,无法放入整数中。”);
返回0;
}
printf(“%d\n”,参数);
fib(论点);
返回0;
}
无效纤维(整数最大值)
{
int num[max];///

Microsoft的C编译器不支持C99,我相信他们说过永远不支持。这意味着数组只能以恒定大小声明。

您可以更改函数以动态分配数组,然后在完成后释放内存。函数的其余部分将不加更改地工作

void fib(int max)
{
    int *num = malloc(max * sizeof(int));

    int i;
    for (i = 0; i < max; i++)
    {
        /* Your code here */
    }
    free(num);
}
void fib(int max)
{
int*num=malloc(max*sizeof(int));
int i;
对于(i=0;i
问题在于fib函数

行“int num[max];”是问题所在。这是因为编译器试图分配最大整数数的空间,但在编译时没有正确地为编译器定义标记max

您可以使用动态内存分配来解决此问题

但是我想知道为什么你可能需要这么大的空间(当max很大时),因为你只需要前面的数字来生成序列

void fib(int max)
{

    int a = 0, b = 1; // first 2 numbers of the sequence.
    int c, i;
    for (i = 0; i < max; i++)
    {    
        if (i == 0)
            printf ("%d %d",i,a);
        else if (i == 1)
            printf ("%d %d",i,b); 
        else{
            c = a+b;
            printf ("%d %d",i,c);
            a = b;
            b = c;    
        }
    }
}
void fib(int max)
{
int a=0,b=1;//序列的前两个数字。
int c,i;
对于(i=0;i
使用alloca将尽可能接近VLA。@moshbear:当然
alloca
是非标准的;Microsoft支持它吗?
alloca()
与VLA有一个严重的缺陷:它没有报告分配是否成功的机制。好的:不需要
free()
。坏的:只在BSD/GNU中定义(没有POSIX或ISO)。如果分配太多,丑陋的:UB。此外,MSVC将其定义为
\u alloca
(无需重命名,malloc中的
\define
。h会为您这样做)谢谢!有没有理由说为什么有些人还没有切换到C99标准?根据维基百科,C99已经出现了10年了?@贾斯廷-它导致了一些与C++ C++的不兼容。MSFT声称他们的是C++编译器,这是它的主要市场。
void fib(int max)
{

    int a = 0, b = 1; // first 2 numbers of the sequence.
    int c, i;
    for (i = 0; i < max; i++)
    {    
        if (i == 0)
            printf ("%d %d",i,a);
        else if (i == 1)
            printf ("%d %d",i,b); 
        else{
            c = a+b;
            printf ("%d %d",i,c);
            a = b;
            b = c;    
        }
    }
}