2017-03-01 5 views
-1

ヘッダーファイル - gameboard.h - というゲームボードという名前の構造体があります。この構造体では、square **squaresを宣言します。ここで、四角形は次のようになります。typedef enum {EMPTY, RED_COIN, YELLOW_COIN} square;カスタムタイプでmalloc()を使用するには?

私は2次元配列のメモリを割り当てる関数を持っています。この関数では、gameboard* resultと宣言します。

質問:最初のアレイを作成、配列を格納します2Dの一部つまり、なぜ私はこれを行うことはできません。

result->squares = malloc(numRows * sizeof(result->square*)); 

具体的には、なぜ平方無効な型があります?

+0

'square'が型名であれば、' result-> square'で何を言おうとしていますか?これはちょうどCでは意味をなさない。Cでは、* member access *演算子である。構造体に 'square'という名前のメンバーはありません。 – AnT

+0

'anytype **'のようなものは2D配列ではなく、1つを指すこともできません!そしてあなたは[ask]を読んで[mcve]を提供するべきです。 – Olaf

答えて

3

result->square部分式が無効であるため、「これを行う」ことはできません。 result->squaresが有効です。 Plain squareも有効です。しかし、result->squareは全く意味がありません。 C ->はメンバーアクセスオペレータです。そして、あなたの構造体型は、squareという名前のメンバーを持っていません。

  • ように見えるオブジェクトの配列を-ing mallocための典型的な/慣用Cコードは、私たちはあなたのresult->squares場合

    result->squares = malloc(numRows * sizeof *result->squares); 
    
  • を取得

    some_pointer = malloc(n_elements * sizeof *some_pointer); 
    

    は、あなたの場合にこれを適用すると、以下のタイプがsquare **であれば、適切なサイズはsizeof(array_element_type)として

    result->squares = malloc(numRows * sizeof(squares *)); 
    

    しかし、以前の(型にとらわれない)改変体は、この後者のバージョンよりも、おそらく型に依存しないという点ではおそらく優れています。参照してください:あなたはsizeof(result->square*)に到着するために管理方法Why is it safer to use sizeof(*pointer) in malloc

は、私には全く不明です。あなたの変種は、間違った無意味な方法で書かれた2つの奇妙なハイブリッドのように見えます。

+0

また、gameboard.squaresはsquareのポインタの配列として宣言されています。これが意図かどうかはわかりません。 –

+0

@AnT:私のクラスは現在ポインタと構造体を処理していますが、私の知るところにはギャップがあることは明らかです。あなたのコメントと私の質問を見直した後、私は投稿する前に多くの間違いがあるのを見ます。私の次の質問は、intの2次元配列と私の場合のmalloc()の使用の違いです。たとえば、私はintsのためにこれを行います:somePtr = malloc(sizeof(int *)* numElements)。構造体を扱うときに、型(正方形)の代わりに四角形を使う理由は何ですか? – darylnak

+0

@KC Wong:OPは、究極の目的は2Dアレイを作成することであると述べました。典型的な "ギザギザの配列"アプローチの後であると仮定すると、 "ポインタへのポインタ"として宣言された 'squares'は全く奇妙に見えません。 – AnT

関連する問題