2011-09-05 159 views
7
if(stat("seek.pc.db", &files) ==0) 
    sizes=files.st_size; 

sizes=sizes/sizeof(int); 
int s[sizes]; 

我编译这在Visual Studio 2008和我得到以下错误: 错误C2057:预期常量表达式 错误C2466:不能分配恒定大小为0错误C2057:预期常量表达式

的阵列

我试过使用矢量s [尺寸]但无济于事。我究竟做错了什么?

谢谢!

+1

只是想通知它一个依赖于编译器的问题,用gcc(C99)试一试,你的代码将被编译。 –

回答

9

C中数组变量的大小在编译时必须已知。如果你只是在运行时才知道它,你将不得不malloc而不是你自己。

+3

C99确实有可变长度数组(VLA),但是Microsoft的编译器不支持它们。 ('不能分配一个常量大小为0的数组错误可能只是编译器被混淆了。) –

+0

我试图通过int * s = new int [sizes];来分配内存。它给我System.AccessViolationException错误。是因为这个吗? – Ava

+0

@Richa,听起来更像是.net而不是C。而'new int [size]'不是C语法,而是C++。 –

4

数组的大小必须是编译时间常量。但是,C99支持可变长度数组。因此,而不是你的代码在你的环境中工作,如果数组的大小在运行时则称为 -

int *s = malloc(sizes); 
// .... 
free s; 

关于错误消息:

int a[5]; 
    //^5 is a constant expression 

int b = 10; 
int aa[b]; 
    //^ b is a variable. So, it's value can differ at some other point. 

const int size = 5; 
int aaa[size]; // size is constant. 
+0

我可以初始化size为'const int size = 5;'中的变量吗? – Ava

+0

@Richa - 你必须初始化一个常量变量。您无法对其执行任何类型的分配。 http://ideone.com/D4L5r – Mahesh

+0

我试图通过'int * s = new int [sizes];'来分配内存。它给我System.AccessViolationException错误。是因为这个吗? – Ava