2013-05-12 84 views
2

我有一個奇怪的問題,在循環中分配鏈接列表。循環分配鏈接列表內嵌結構不分配內存

考慮簡化源代碼:

struct main_s { 
    minor_s minor_structure; (inline) 
}; 

struct minor_s { 
    list_s *first_dir; 
}; 

struct list_s { 
    anotherlist_s *first_object; 
    list_s *next; 
}; 

struct anotherlist_s { 
    //multiple fields 
}; 

,我有一個基本的init/DEINIT功能,如:

struct main_s *main_s_init(); 
void main_s_deinit(); 

,現在我還挺充斥着在循環分配:

im passing to this function main_s->minor_structure.first_dir and, how_many parameter, defining how many linked nodes going to be initiated. 

void loop_inittiation(struct list_s *list, int how_many) { 
    int i; 
    struct list_s *tmp = list; 
    for(i = 0; i < how_many; i++) { 
     tmp = malloc(sizeof(struct list_s)); 
     tmp = tmp->next; 
    } 
} 

這就是我遇到的問題,即時分配臨時「tmp」而不是指向結構真實存在。我明白,要通過tmp分配一個指針,你必須使用雙指針,但它仍然不起作用。我錯過了什麼?在gdb中沒有分配內存空間:/。 我必須使用** tmp嗎?

回答

5

你對錯在哪裏有正確的想法。函數中tmp的本地拷貝被改變,但是一旦你在外面,那個值就會丟失。如果你想在C中的一個不同的函數內改變一個變量,你必須傳遞你想改變的東西的地址。如果你想改變的東西已經是一個指針,你必須傳遞指針的地址(或雙指針)。如果它是一個你想改變的雙指針,那麼你必須傳遞一個三指針。如果它是一個123141的指針,你必須通過一個123142指針:)

更改參數的功能:

&(main_s->minor_structure.first_dir) 

輸入參數只是改變

struct list **list 

變化tmp目錄一個雙指針來匹配它,然後每次使用tmp時,請確保拋出額外的解除引用。

struct list_s **tmp = list 

*tmp = malloc(sizeof(struct list_s)); 
*tmp = (*tmp)->next; 

所以它看起來像:

void loop_inittiation(struct list_s **list, int how_many) { 
    int i; 
    struct list_s **tmp = list; 
    for(i = 0; i < how_many; i++) { 
     *tmp = malloc(sizeof(struct list_s)); 
     tmp = &((**tmp)->next); 
    } 
} 

另一種方式來做到這一點是獨自離開tmp的東西,作爲一個單一的指針,存儲你分配的第一個節點,然後只說

*list = tmp; 

但是,然後你必須把第一次分配作爲一種特殊情況。

+0

好吧,它不能在這個例子中工作,不幸的是,我得到了成員'下一個'的錯誤請求,而不是結構或聯合。將試圖弄清楚。 – user2207495 2013-05-16 10:14:57

+0

即使輸入* tmp =((* tmp) - > next);它編譯但只改寫結構中列表的第一個節點,而不是進入下一個節點。 – user2207495 2013-05-16 10:33:54

+0

它應該是tmp =&((** tmp) - >下一個)? – xaxxon 2013-05-16 17:04:04