2016-09-05 32 views
1

次のコードがあります。読書の順序が間違っているようです。どんな助け?構造体Cでの二重参照

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct punct{ 
int x; 
int y; 
}COORD; 

typedef struct nod{ 
COORD *coord; 
struct nod *urm; 
}NOD; 
int main() 
{ 
    NOD *head= malloc(sizeof(NOD)); 
    scanf("%d", &head->coord->x); 
    scanf("%d", &head->coord->y); 
    printf("%d, %d", head->coord->x , head->coord->y); 

    return 0; 
} 

私は正常head->coordを使用することにより、構造体の唯一のXフィールドにアクセスするために管理され、私はそれが私のコードの問題だ伝えることができるものとしています。私はすでに最初の構造体の最初のフィールドにあるので、そのためにx/yにアクセスすることはできません。

+4

'head-> coord'はどこで初期化しますか? –

+0

適切なparanthesisで試してください: 'scanf("%d "、&(head-> coord) - > y));' –

+0

@OliverCharlesworthありがとうございました。私はそれが頭の初期化で覆われたと思った。 –

答えて

2

head->coordを初期化していません。初期化されていないポインタを参照解除すると、undefined behaviourになります。あなたはまた、障害のためにmalloc()の戻り値をチェックする必要があります

head->coord = malloc(sizeof (COORD)); 

:あなたのような何かをする必要があります。

4

coord変数を初期化していないので、mallocもそれに合わせてスペースを詰めるようにしました。

head->coord = malloc(sizeof (COORD));

しかし、この場合には、それに参照するのではなく、NODでCOORDを置くのがベストかもしれません!だから、

:あなたがオブジェクトをたくさんまたはときに、より複雑なオブジェクトを交換しようとしているときにのみ、実際にそれへのポインタをする必要があり

typedef struct nod{ 
    COORD coord; 
    struct nod *urm; 
}NOD; 

+1

ここでは 'COORD'を直接埋め込んでいるようです。もしそれが 'COORD'値の配列であるなら、あなたはまたカウントを必要とします。 –

+0

@JonathanLeffler COORDの配列を作成したいとします。どのようにして '' COORD ** A = malloc(n * sizeof(COORD *)); 'という配列ができるかのリンクを作成するにはどうすればいいですか?ここで、nはx、yペアの数で、NOD型のリストです。頭が頭の中で頭が頭のどこにあるのかを、それぞれの反復で、私は 'A [i] - > x = head-> coord-> x'と' A [i] > y = head-> coord-> y'。何かご意見は? –

+0

@AlexPostolache:次のような構造を仮定します: 'typedef struct nod {size_t num_coords; COORD * coord; struct nod * urm; } NOD; 'ならば、' NOD * nod = malloc(sizeof(* nod));を定義します。 if(nod == 0){...エラー...; } nod-> coord = malloc(n * sizeof(* nod-> coord)); if(nod-> coord == 0){...エラー...;自由(nod); } nod-> num_coords = n; nod-> urm = 0; 'またはその付近。 'nod-> coord [0]' .. 'nod-> coord [nod-> num_coords-1]'は構造体が使うための座標の配列を割り当てます。 –

関連する問題