2009-04-25 142 views
3

在下面的代碼中,我得到一個分段錯誤段錯誤:與指針到指針與C/Linux的

Set *getpar() {...} 

char function(...) 
{ 
    Set **S; 
    *S = getpar(); /* Segmentation Fault */ 
    ... 
} 

但離奇的是,有一些變化,沒有分段錯誤:

Set *getpar() {...} 
... 
char function(...) 
{ 
    Set *S;  // One less '*' 
    S = getpar(); // One less '*' 
    ... 
} 

據我所知,如果有'Set **S'那麼*S是指向Set對象的指針,所以如果第二個代碼工作正常,爲什麼不應該第一個?第一個代碼的*S相當於第二個代碼的S,我是不是對不對?我該如何解決這個問題?

回答

9

集** S沒有initized,但取消引用■在下面的語句:

* S =無論

除非你真的,真的不走運和S指向一個內存位置,您可以實際上訪問,你試圖取消引用無效指針。

您需要首先分配指針:

Set **S; 
S = (S**)calloc(sizeof(S*),1); 
*S = getpar(); 

,或者(和理想,我認爲):

Set *S; 
Set **T = &S; 

S = getpar(); 

/* whatever else */ 
+1

非常感謝!我花了幾個小時在那件事上。 – 2009-04-25 22:30:32

0

** S沒有初始化。它指向什麼都沒有(垃圾),然後你在下一個語句中去引用它。