2013-03-24 67 views
1

我在C中有一個遞歸函數,我希望返回的結構指針成爲函數中的新結構。林具有返回的結構有問題,因爲它不change.this是我的代碼的結構:如何更改函數中的指針?

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; 

} 

林具有返回的結構有問題,因爲它並沒有改變。

它意味着通過相互引用來堆疊這些結構。

+3

你可以發佈一個最小的工作計劃?你發佈的內容有錯誤的編譯錯誤,沒有足夠的邏輯來找到錯誤。 – 2013-03-24 11:03:50

+0

確保x不會變成負面!你*真的*不會希望'm-> map [-1] ...'。 – Sebivor 2013-03-24 11:30:56

回答

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

但是,如果我做了一個**出溫度如何分配變量x,y和dir? – Funonly 2013-03-24 11:25:23

+0

@Fononly編輯 – Alex 2013-03-24 11:31:21