2017-02-27 21 views
0

これはおそらく簡単な答えの質問ですが、私はそれに似た何かを適切な解決策で見つけることはできません。私はstructを作成しようとしています。これは2つの変数と、次にstructの作成に使用された2つの可変パラメータの次元と等しい次元の2次元配列です。C構造体内の可変2D配列

struct image{ 
    int width; 
    int hight; 
    int pixles[width][height]; 
}; 

は、今私は、私もそれをコンパイルする前に、これは動作しないだろう知っていたが、私はこの作品を作って行くするかどうかはわかりません。

+0

は、1Dアレイと2段配分へのポインタを使用してください。 – Olaf

+1

これは不可能です。構造体のサイズはコンパイル時に知る必要があります。 –

+0

これを参照してください:http://stackoverflow.com/questions/5170525/array-in-c-struct – kr1tzb1tz

答えて

0

コメントで言われたように直接行うことはできません。 に2つの一般的なイディオムがそれ(VLAを想定したが、サポートされている)をシミュレートがあります。

  1. 構造体の唯一の店舗(動的に割り当てられた)配列へのポインタあなたは、あなたが2DへのポインタにキャストVLA配列:あなたが動的構造体を割り当てた場合、あなたは(VLAポインタにして再度キャスト)その最後の要素として、0サイズの配列を使用することができます

    typedef struct _Image { 
        int width; 
        int height; 
        unsigned char * data; 
    } Image; 
    
    int main() { 
    
        Image image = {5, 4}; 
    
        image.data = malloc(image.width * image.height); 
        unsigned char (*data)[image.width] = (void *) image.data; 
        // you can then use data[i][j]; 
    
  2. typedef struct _Image { 
        int width; 
        int height; 
        unsigned char data[0]; 
    } Image; 
    
    int main() { 
        Image *image = malloc(sizeof(Image) + 5 * 4); // static + dynamic parts 
        image->width = 5; 
        image->height = 4; 
        unsigned char (*data)[image->width] = (void *) &image->data; 
        // you can then safely use data[i][j] 
    
  3. VLAは、あなたのCの実装でサポートされていない場合は

、あなたは1Dポインタを通じて2次元配列をシミュレートするの古いイディオムに戻す必要があります。data[i + j*image.width]

関連する問題