2011-09-05 2 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:予想定数式

一定のサイズの配列を割り当てることができません

私はベクトル[サイズ]を使ってみましたが、役に立たなかったのです。私は間違って何をしていますか?

ありがとうございます!

+1

はちょうどそれがあることを通知したかったですコンパイラ依存の問題、gcc(C99)で試してみると、コードがコンパイルされます。 –

答えて

9

Cの配列変数のサイズは、コンパイル時に知っている必要があります。あなたが実行時にのみそれを知っている場合は、自分でmalloc自分のメモリを持っている必要があります。

+3

C99には可変長配列(VLA)がありますが、Microsoftのコンパイラはそれらをサポートしていません。 ( '定数サイズ0の配列を割り当てることはできません 'というエラーはコンパイラが混乱しているだけかもしれません) –

+0

int * s = new int [sizes];でメモリを割り当てようとしました。それは私にSystem.AccessViolationExceptionエラーを与えます。これのためですか? – Ava

+0

@Richa、それは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

サイズを「const int size = 5;」の変数に初期化できますか? – Ava

+0

@Richa - 定数変数を初期化する必要があります。あなたはそれへのどんな種類の割り当ても行うことができません。 http://ideone.com/D4L5r – Mahesh

+0

私は 'int * s = new int [sizes];'でメモリを割り当てようとしました。それは私にSystem.AccessViolationExceptionエラーを与えます。これのためですか? – Ava

関連する問題