2016-09-05 3 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을 초기화하지 않았습니다. 초기화되지 않은 포인터를 Dereferencing하면 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 요소의리스트입니다. 나는 머리가 NULL 일 때까지 생각하고 있었다. 머리는 나의 목록의 시작 부분이다. 각 반복에서 나는 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) {... error ...; } nod-> coord = malloc (n * sizeof (* nod-> coord)); if (nod-> coord == 0) {... error ...; 무료 (끄덕임); } nod-> num_coords = n; nod-> urm = 0;'또는 그 근처. 이것은 구조체가 사용할 좌표 배열을 할당한다 :'nod-> coord [0]'..'nod-> coord [nod-> num_coords - 1]'은 유효한 참조이다. –