2016-07-18 3 views
-1

私は構造体を初めて使用しています。 AのメンバーがB型の構造体になるようにネストされた構造体を作成したい。私がこれまでに持っていたコードを以下に示します。他の構造体の内部で構造体を使用する方法(mallocと2D配列を使用しているのですか?)C

typedef struct B 
{ 
    int b1; 
} b; 

typedef struct A 
{ 
    b a1; 
}a; 

しかし、私はまた、「A1」はダイナミックな2D配列である必要があり、私でした次のコード(これはi「は、配列のためには、このためのポインタへのポインタを使用するように右であるかどうかわかりません'実行時に設定するサイズ):

typedef struct B 
{ 
    int b1; 
} b; 

typedef struct A 
{ 
    b **a1; 
}a;  

メモリを格納するために、mallocを使用しました(エラー検出部分はありませんでした)。私はa1の各メンバーをxで参照し比較する必要があります(下のaとbは整数です)。私はこれをすることができますか?:

a* one; 
b** two; 

one= malloc(10* sizeof(a*)); 
two= malloc(10* sizeof(b*)); 
for(x = 1; x <= 10; x++) 
    { 
     two[x] = malloc(10* sizeof(b)); 
    } 

if(one[x].two[a][b] == x) 
    one[x].two[a][b].b1 =2; 

申し訳ありません私のコードは全く意味をなさない。

+1

式b ** a1は2次元配列ではありません。これは、ポインタを保持する変数へのポインタです。 –

+0

@ clarasoft-itが書いたものに追加するには:2D配列としても使用することはできません。 2D配列を割り当てて扱う方法を示す十分なQ&Aがここにあります。それらを読むと、扱いがはるかに簡単です。 – Olaf

+0

私はそれを手に入れました!基本的に、xがタイプbでない限り、それは動作しません。だから私はちょうど同様の比較を行うことができるように、b、int b2に別のメンバーを追加しました –

答えて

2

私も2D配列であることを「A1」を必要とするので、私は次のようでしたコード( わからないこれが正しければ):

typedef struct B 
{ 
    int b1; 
} b; 

typedef struct A 
{ 
    b **a1; 
}a; 

コードは、有効なCを提供します宣言がありますが、2次元配列はありません。メンバーa1struct Aは、全く同じものではないstruct Bへのポインタへのポインタです。あなたが本当に2次元配列を宣言したいなら、あなたはその境界を与える必要があり、例えば

typedef struct A { 
    b a1[5][7]; 
} a; 

あなたが実行時までに必要なサイズが分からない場合は、しかし、その後、ダブルポインタが何をしたい確かにあります - 2D配列と混同しないでください。

メモリを格納するために、malloc(エラー検出部はありません)を使用しました。私はa1の各メンバーをxで参照し比較する必要があります(下のaとbは整数です)。

いいえ、abは既に同じスコープ内の型名として使用しているため、整数にすることはできません。

私は、これはすでに述べた名前の衝突に加えて

a* one; 
b** two; 

one= malloc(10* sizeof(a*)); 
two= malloc(10* sizeof(b*)); 
for(x = 1; x <= 10; x++) 
    { 
     two[x] = malloc(10* sizeof(b)); 
    } 

を?:行うことができ、oneのあなたの割り当てが間違っています。それは...

one = malloc(10 * sizeof(a)); 

...またはさらに良い...

one = malloc(10 * sizeof(*one)); 

twotwo[x]の割り当てはOKですが、上記の後者の例と同じ方法で書き直すと良いでしょう。

if(one[x].two[a][b] == x) 
    one[x].two[a][b].b1 =2; 

(整数ij用)one[x].two[i][j]のタイプはstruct Bを言うことである、bあります。 xのタイプはintです。これらは匹敵しないので、いいえ、ifの条件式を評価することはできません。しかしone[x].two[a][b].b1への割り当てはOKです。

+0

感謝します!これは本当に役立ちます。以前に提案された@Olafのように2D配列を持つように私のコードを変更していました。私は実行時に配列のサイズを設定する方法を見落としてしまったと思ったので、わかりました。割り当てについての間違いを訂正していただきありがとうございます。 –

+0

ただの質問です... 1つは配列なので、1つの割り当てに*を必要としませんか?私はこのコード行を参照しています:one = malloc(10 * sizeof(a *)); –

+0

@ J.DOLE。いいえ。「1」のタイプは「a *」です。あなたは指し示されたもののサイズの倍数でスペースを確保する必要があります。この場合は 'sizeof(a)'です。しかし、 "one pointが" sizeof(* one) "のように「メモリの割り当て時に特に適している」ということを「スペルの大きさ」で綴ることができます。これには、「1」のタイプを変更した場合に変更する必要がないという利点もあります。 –

0

2Dダイナミックメモリ割り当てを使いこなす代わりに、2D配列を1Dアレイで偽装することができます。

b *a1; 
a1 = malloc(sizeof(b) * width * height); 
for(i = 0; i < height; i++) 
    for(j = 0; j < width; j++) 
     do_stuff(a1[i*width + j]; //simulates a1[i][j] 

これは必要で唯一のものは、あなたがどこかにあなたの幅と高さの値を格納することで、例えば

typedef struct A { 
    b *a1; 
    int height; 
    int width; 
} 
+0

そしてその価値は何ですか? OPが2D配列を使用してはならない理由は何ですか? (それはFAMでも意味をなさないかもしれませんが、あなたはそれを示していません)。 – Olaf

+0

これは、新しいプログラマを混乱させる奇妙な複雑さに陥ることなく、OPが "2D"配列を動的に割り当てることを可能にします。これは、2D配列より効率的ではなく、読みにくいです。 – Robert

+1

'2D配列よりも効率的ではありません.'はCによって定義されていません。組み込みの乗算(ローエンドの組み込みプロセッサを考える)がなければ、このコードはあまり効率が悪いです。 – chux

関連する問題