2011-03-19 68 views
1

我需要在C指針指向幫助我有兩個結構一個結構做出這樣的:指針在C

typedef struct s{ 
     s2** d; 
     struct s* next; 
    }s; 


typedef struct s2{ 
     c* fi; 
     struct s2* next; 
    }s2; 

而且我有這樣一個功能:

void modify(c* a, s2* b){ //c* is a pointer to a struct 
    s* rd = malloc(sizeof(s); 
    rd->next = NULL; 
    //need also to initialize the field "d" of the "s" struct 
} 

這是產生錯誤。如示例中所示,我需要將結構rd指向b。我需要存儲一個雙指針,因爲s2以類似列表的方式鏈接,所以我需要**指針有可能刪除列表的第一個元素。我在rd-> d = & b這樣的註釋中做了任務,但是當我試圖在函數中使用字段「d」時,我有一個無效的內存讀取,我無法理解爲什麼。

+0

你能解釋爲什麼你需要'd'類型的雙指針嗎?根據你的描述,這根本不明顯。 – jv42 2011-03-19 14:23:28

+0

struct s中的d是什麼?你爲什麼試圖將s2 *分配給d **? – Ptival 2011-03-19 14:25:36

+0

@Ptival:對不起,這是s2 **,我試圖把事情弄得一團糟,讓你明白這個問題。 @ jv42:因爲s2存儲在另一個結構(如s2 *)內,我需要能夠將該指針設置爲NULL。我知道這是相當複雜的.. – Raffo 2011-03-19 14:32:16

回答

1

我假設問題是這樣的:

你傳入s2* b作爲參數傳遞給modify,因此該指針駐留在堆棧中。現在,當您分配rd->d = &b時,您將在堆棧中獲取該位置,該位置僅在執行離開modify的範圍之前有效。因此,如果稍後取消引用rd->d,則會訪問棧上的(現在無效的)位置,從而產生垃圾或崩潰。 (然而,在這種情況下,你應該能夠提領rd->d正確,同時仍然在modify

也許你會想改變b是如何傳遞到修改,最有可能成爲類似s2** b,這樣就可以正確傳入指向另一個結構中指向s2的指針,而不是使其成爲指向s2的指針,該座標位於modify的堆棧上。

基本上是這樣的:

void modify(c* a, s2** b) { 
    s* rd = malloc(sizeof(s)); 
    rd->next = NULL; 
    rd->d = b; 
} 

,並調用它像

s2* myS2 = ...; 
modify(<whatever>, &myS2->next); 

這應該讓你的指針的位置傳遞給它你甚至可以後儲存起來,並取消引用s2實例modify完成(未經測試,但)。

+0

這應該可以解決問題。 – Raffo 2011-03-19 16:37:01