以下代码使用 gcc -std=c99 在 Linux 上可以正常编译,但在 Visual Studio 2010 C 编译器上出现以下错误:
适用于 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”:未知大小
用户输入要生成的斐波那契数的数量。我很好奇为什么 Microsoft 编译器不喜欢这段代码。
#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]);
}
}
void fib(int max)
{
int num[max];
微软的C编译器不支持C99,我相信他们已经说过永远不会支持。这意味着数组只能声明为常量大小。
问题出在 fib 函数上。
“int num[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 *num = malloc(max * sizeof(int));
int i;
for (i = 0; i < max; i++)
{
/* Your code here */
}
free(num);
}