2012-03-05 4 views
0

좋아, 그럼 내가 작업하고있는 비디오 게임의 구조에 대해, 구조체 "던전"내부에 구조체 "룸"을 할당해야합니다. 불행히도 필요한 모든 정보를 넣을만큼 충분한 메모리를 할당 할 수 없습니다. 내 데이터 구조의 샘플은 다음과 같습니다.Segfault. 구조체 내에서 구조체에 대한 메모리 할당

typedef struct monster { 
    int difficulty; 
    char *name; 
    char *type; 
    int hp; 
} monster; 

typedef struct rooms { 
    int n_monsters; 
    int visited; 
    struct rooms *nentry; 
    struct rooms *sentry; 
    struct rooms *wentry; 
    struct rooms *eentry; 
    monster *monsters; 
} rooms; 

typedef struct dungeon { 
    char *name; 
    int n_rooms; 
    rooms *rm; // Subject to change 
    rooms sroom; 
} dungeon; 

그리고 여기가 내 세그먼테이션 결함이 있습니다.

d->name = "Dungeon 1"; 
d->n_rooms = 10; 
rooms *room = malloc(d->n_rooms * sizeof(rooms)); 

// Room 0 
room[0].n_monsters = 1; 
room[0].visited = 0; 
*room[0].sentry = room[1]; // xCode is showing the seg-fault here 

// Room 2 
room[1].n_monsters = 1; 
room[1].visited = 0; 
*room[1].nentry = room[0]; 

d->rm = room; 

왜 나는 seg-fault가 발생합니까? 충분한 메모리를 할당하고 있습니까?

답변

1

room[0].sentry에 메모리를 할당하지 않았습니다. 시도 :

room[0].sentry = malloc(sizeof *room[0].sentry); 
*room[0].sentry = ... 

또는, 당신은 단지 (나는 당신의 경우에 더 잘 작동한다면 생각) 포인터를 할당 할 수 있습니다 :

room[0].sentry = &room[1]; 
+0

당신을 감사합니다! 이것은 많은 도움이되었습니다. 하나의 질문이지만, 포인터를 할당하여 여전히 모든 별도의 객실에 충분한 메모리를 할당합니까? – atb

+0

@alexthebake'room [0] .sentry'와'room [1]'포인터를 같은 것에 할당함으로써. 따라서 하나를 변경하면 다른 하나에 반영됩니다. – cnicutar

관련 문제