2016-11-14 2 views
5

興味深い事実を発見しましたが、どのように動作するのか分かりませんでした。
次のコードは完全に機能しています。Cでconst変数を持つ配列サイズ

#include <stdio.h> 
int main(){ 
    const int size = 10; 
    int sampleArray[size]; 
    typedef char String [size]; 
    return 0; 
} 

次に、グローバルスコープの定数変数のみを使用しようとしましたが、それでも問題ありません。

#include <stdio.h> 
const int size = 10; 
int main(){ 
    int sampleArray[size]; 
    typedef char String [size]; 
    return 0; 
} 


しかし、私もグローバルに配列の範囲を変更した場合、私は次のようだ:

error: variably modified ‘sampleArray’ at file scope

#include <stdio.h> 
const int size = 10; 
int sampleArray[size]; 
typedef char String [size]; 
int main(){ 
    return 0; 
} 

をそして、私はそれを取得できませんでした! ex変数の代わりにconst変数を置き換えます。 #defineにも大丈夫でしょう。
私は、#define変数が前処理されていることを知っています。私が知る限り、const変数は読み取り専用です。しかし、結局のところ、グローバルな範囲を作るのは何ですか?

2番目のコードが問題ない場合は、3番目のコードに何が問題なのか分かりません。

+3

詳細:Cには 'const'オブジェクトがありますが、_constant_はありません。 'const'は_constant_を意味するようですが、' const'オブジェクトは_constant_ではありませんが、「このオブジェクトは変更してはいけませんが、変更が試行されれば何が起こるか知っていますか? Cでは、真の_constant_は '42'のようなコードであり、これは' int'型の整数定数です。したがって、 'const int size = 10;'は_constant_変数ではありません。 – chux

+0

配列には一定のサイズはありませんが、可変長配列です。 – Olaf

+1

彼らが言ったように、Cには 'const'オブジェクトがあります。これは実際には読み込み専用*変数*です。 Cf。 C++は実際にはコンパイル時*定数*である真の 'const'オブジェクトを持っています。 –

答えて

6

可変長配列は、自動保存期間のみを持つことができます。 VLAはC99に導入された。あなたは

#define SIZE 10 

//... 

int a[SIZE]; 
ようなマクロのいずれかを使用することができ、この規格の前

VLAのサイズは、実行時にdeterminatedされているため、静的記憶域期間とVLAを宣言することはできません(下記参照)

か、constの修飾子を削除し、ちょうど

012を書き込むことができる。ところで

enum { SIZE = 10; } 

//... 

int a[SIZE]; 

のような列挙の列挙子代わりの

int size = 10; 

const int size = 10; 

考慮に

ください(C++では、あなたがC++では、いくつかのコンパイラは、独自の言語拡張を持つことができることを除いて一切のVLAはありませんけれどものconst修飾子を使用する必要があります)

VLAの sizeof演算子は、コンパイル時ではなく実行時に計算されます。

+0

ありがとうもう少し理解し始めました!しかし、constなしで試してみると、グローバルスコープで同じエラーが出ます。しかし、#define SIZE 10で、それは動作します。 –

+0

@BálintPap私が書いたように、VLAには、すべてのグローバルアレイが持つ静的記憶期間がないかもしれません。 –

+0

A、ここに行きます、大丈夫です!まあ、それについては決して考えなかった。説明ありがとうございます!私はそれを感謝します! –

関連する問題