2011-03-17 58 views
0

我无法运行我的结构程序。 ,因为它正在获得“需要的常量表达式”错误。 在这一行:结构程序

struct book_info book[i]; 
+0

请用适当的语言标记您的问题(编辑您的帖子)。该ora-xxxx错误标记是无关的。我猜对了[E]。 – Mat 2011-03-17 07:02:16

+0

请提供更多的上下文。 – 2011-03-17 07:20:37

回答

4

您几乎肯定使用编译器(或一个编译器模式)不支持可变长度数组。

声明可变长度数组(VLA)的能力已被添加到C99,因此,如果您的编译器不符合标准,或者您正在编译类似gcc -std=c89之类的东西,它将无法工作。

例如:

pax$ cat qq.c 
#include <stdio.h> 
#include <string.h> 
int main (void) { 
    int i = 7; 
    char x[i]; 
    strcpy (x, "xyz"); 
    printf ("%s\n", x); 
    return 0; 
} 

pax$ gcc -std=c99 -pedantic -Wall -o qq qq.c ; ./qq 
xyz 

pax$ gcc -std=c89 -pedantic -Wall -o qq qq.c 
qq.c: In function ‘main’: 
qq.c:5: warning: ISO C90 forbids variable length array ‘x’ 
+3

...最重要的是,变长数组不能在文件范围中定义。 – AnT 2011-03-17 07:05:50

0

您应该使用动态分配。我想,这正是你想要的东西: http://fydo.net/gamedev/dynamic-arrays

问候

+1

这不是个好建议。你完全不知道OP在编程什么样的系统,所以你不知道使用动态分配是合适的,多余的还是完全禁止的。 – Lundin 2011-03-17 07:37:05

+0

可能需要添加一些细节。我推测是运行Linux或Windows。 – Sacx 2011-03-17 07:40:13

+0

这个数组的分配被声明为“i”大小 - 没有迹象表明数组的大小在其整个生命周期内都会改变,因此不需要它是动态的。 – 2011-03-17 07:47:06

0

在旧的C标准(C89),你可以只设置数组长度有“恒数字文字”,即

int array[100]; 

#define X 100 
int array[X]; 

在新的C标准(C99),如果变量被在文件范围(全局)分配同样适用。但是,如果数组在本地作用域(在函数内部)分配,那么C99允许您使用非常量值,如您的示例中所示。

+0

我认为这没有帮助。可能OP希望从程序动态调整数组的大小,而不知道数组在程序启动时会有多大的大小。 – Sacx 2011-03-17 07:41:24

+0

@Sacx可能你错了。无论你是否,这确实有帮助。 – 2011-03-17 07:48:15

+0

@Sacx正如我写的,C99允许你这样做,只要数组可以分配到堆栈而不是堆。 – Lundin 2011-03-17 13:28:19