2013-03-24 3 views
1

C에서 재귀 함수가 있고 반환 된 구조체 포인터가 함수의 새 구조체가되기를 원합니다. 이 변경 나던 때문에 반환 된 구조체에 문제가함수에서 포인터를 어떻게 변경합니까?

struct location_t{ 
    int x,y; 
    location_t * next; 
    int dir; 
} 

location_t * recursive_foo(location_t * loc, maze_t * m){ 

    int x = loc->x; 
    int y = loc->y; 
    int dir = loc->dir; 

    loc->next = malloc(sizeof(location_t)); 
    location_t * temp = loc->next; 

    if(m->map[--x][y] != '#' && dir != 0){ 
     temp->x = x; 
     temp->y = y; 
     temp->dir = 2; 
     loc = recursive_foo(temp); 
    } 
    if(m->map[--x][y] != '#' && dir != 1){ 
     temp->x = x; 
     temp->y = y; 
     temp->dir = 3; 
     loc = recursive_foo(temp); 
    } 
    if(m->map[--x][y] != '#' && dir != 2){ 
     temp->x = x; 
     temp->y = y; 
     temp->dir = 0; 
     loc = recursive_foo(temp); 
    } 
    if(m->map[--x][y] != '#' && dir != 3){ 
     temp->x = x; 
     temp->y = y; 
     temp->dir = 1; 
     loc = recursive_foo(temp); 
    } 

    return loc; 

} 

임 :이 change.this 나던 때문에 반환 된 구조체에 문제가 임 내 코드의 구조입니다.

서로를 참조하여 이러한 구조체를 쌓아 넣습니다.

+3

당신이 최소한의 작업 프로그램을 게시 할 수 있습니까? 게시 한 내용에는 오타가 포함되어 있으며 버그를 찾기에는 논리가 충분하지 않습니다. –

+0

x가 음수가되지 않도록하십시오! 당신은 정말로'm-> map [-1] ... '을 원하지 않을 것입니다. – Sebivor

답변

2

mystruct은 스택 변수입니다. 즉, 포인터를 값으로 을 전달하는 대신으로 전달하는 것입니다. 이 값의 사본을 수정하고이 경우

int f(int i) { 
    ... 
    i = <any value>; 
    ... 
} 

: 당신이 지금 무슨 짓을

은 본질적으로 동일합니다.

프로그램에서 포인터의 사본도 수정 중입니다. 함수 바깥쪽에는 포인터가 수정되지 않습니다. 당신이 그것을 수정하려면

, 당신은 포인터를 전달해야

location_t * recursive_foo(location_t** loc, maze_t * m){ 
    int x = (*loc)->x; 
    int y = (*loc)->y; 
    int dir = (*loc)->dir; 
    ... 
    *loc = recursive_foo(&temp); 
    ... 
    return *loc; 
} 
+0

그러나 만약 내가 임시 변통에서 벗어나면 vars x, y 및 dir을 어떻게 할당합니까? – Funonly

+0

@ Funonly 편집 됨 – Alex

관련 문제