2011-01-24 12 views
2

私は次のようにC++クラス内構造体を宣言していますいくつかのコードに出くわした:構造体の最後に配列宣言がありますか?

struct T 
{ 
     int data; 
     T* next; 
} array[0]; 

宣言のこの種は何をしますか? struct defintionの最後に "array [0]"を置くと、どんな効果がありますか?

+1

は、それは、クラスの定義の中で最後のものですか? – ruslik

+0

@ruslik:いいえ。他のインライン関数の前にprivate:セクションにあります。 – Rohit

+0

'T'の' typedef'はありますか? 'next'フィールド宣言は有効でなくても有効ですか? – thkala

答えて

3

ああ、ほぼ"フレキシブルアレイメンバー"です。

これはC99で形式化されましたが、ダイナミックな配列を作成する古いCのトリックです。オブジェクトのためのより多くのメモリを割り当て、あなたは配列に多くの要素を格納することができます。

私は具体的な0の使用は、実際の[]のように妥協があると思います。柔軟な配列はC89やC++にはありませんでした。このパターンの正規の従来の使用は...[1]です。

1

これは、構造体定義がそのクラス内でのみ使用可能であることを意味します。

+0

ありがとうございます。具体的には、最終的に "array [0]"を置くとどんな効果があるのか​​知りたかったのですか? – Rohit

+0

彼は彼の質問の '配列[0]'部分を指していると思います。 – jrharshath

1

タイプTとサイズゼロの配列Tを宣言しようとしています。しかし、C++でゼロサイズの配列を宣言することは正当ではありません。コードは無効です。

1

GCCのような一部のコンパイラでは、zero length arrayは、[]表記を使用して宣言されたフレキシブルクラス/構造体メンバーの同義語です。それはケースだが、場合

0

わからない:

構造は、可変長C文字列(つまり、初期化後に変更されません)、その後、代わりの書き込み含めるする必要がある場合:

struct x { 
    int key; 
    const char* s; 
}; 

を我々は2 malloc年代(構造体の一つであり、文字列に1つずつ)が必要ですとき、私たちは

struct X2 { 
    int key; 
    char s[1]; 
}x2; 
// and use it like 
x2* tmp = (x2*)malloc(sizeof(x2) + strlen(str)); 

を書くことができますここでは、両方のための唯一のmallocを持って、構造AN d文字列。

構造体の最後の属性が配列の場合、構造体に変数空間を割り当てることによって、そのようなメンバの可変数で割り当てることができます。私はこれがあなたの場合に起こると思います。

0

これはよくC構造体ハックとして知られているが、take careあなたはそれを使用

関連する問題