2012-03-02 9 views
0

こんにちは私はここで、以下のシナリオ()動的サイズの構造を作成する方法

#define CONSTANT 10 

struct structA{ 
    int var1; 
    int var2[CONSTANT]; 
}; 

main(){ 
    structA *varA = NULL; 
    int i; 

    /* some C code */ 


    varA = mmap(0,..); 
    for(i = 0; i < CONSTANT; i++){ 
     varA.var2[i] = /* C code */ ; 
    } 

    /* C code */ 

} 

structAvar2配列の要素数が一定ひいてはvarA.var2[i]を直接参照することが可能である持っています。しかし、実行時に数値CONSTANTを動的に決定する場合、構造定義をどのように変更する必要がありますか?その後することができますだけでmmap(NULL, sizeof(int) * (num + 1), ...)

struct structA{ 
    int var1; 
    int var2[]; 
}; 

答えて

1

構造体のサイズに影響するため、定数CONSTANTは実行時に動的に決定できません。

あなたがしようとしている何のための通常のトリックは(私はそれが厳密に有効なCだかはわからないが、それは非常に一般的です)

struct structA{ 
    int var1; 
    int var2[0]; 
}; 

を作成することであり、あなたがマッピングまたは割り当てる際に、(sizeof(structA) + sizeof(int) * CONSTANT)を割り当てますバイト。

+1

[GNU拡張機能](http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html)に注目することは重要です。 – cnicutar

3

クリーンな方法は、C99柔軟な配列メンバーを使用することです。フレキシブルな配列メンバーには注意が必要です。sizeofは、それらのサイズではなく面白いように動作します。

フレキシブルなアレイメンバーを使用できない/使用しない場合は、アレイの代わりにポインタを使用し、別々にmmapメモリを使用できます。

2

これを行うための最も一般的な方法は次のとおりです。

struct structA{ 
    int var1; 
    int var2[1]; 
}; 

あなたがstructAのサイズよりも多くのメモリを割り当てるので、それは、実際には単一の要素を持つ配列ではありません。

関連する問題