2013-05-20 82 views
-1

我們正在返回一個指向我們函數中某個結構的指針。當我們打印出主結構中的某個值時,這是正確的。但是,當我們將該指針傳遞給另一個函數並嘗試訪問某個值時,它將輸出一個不正確的值。看起來這個值是一個地址。無效/空指針不正確的值

這些電話是在我們的主:

struct temp * x = doThis(); 
printf("x->var1 = %d\n", x->var1); 
doThat(&x); 

在找時間做,我們打印出:

void doThat(void * x) 
{ 
    struct temp * x2 = (struct temp *) x; 
    printf("x2->var1 %d", x2->var1); 
} 

的doThis函數返回一個空指針和一個空指針的找時間做函數將作爲參數。

+0

最可能的是,你需要'找時間做(X)'。 –

+0

@KerrekSB它被宣佈爲'doThat(void * x);' – user1553248

+2

你是否不希望你寫這個荒謬的演員,你的團隊中沒有人能夠解釋? –

回答

8

doThat您正在鑄造x爲struct temp*,但您傳遞struct temp**

您可以在此類似的結果:running code

下更改:

struct temp * x2 = (struct temp *) x; 
printf("x2->var1 %d", x2->var1); 

要:

struct temp ** x2 = (struct temp **) x; 
printf("(*x2)->var1 %d", (*x2)->var1); 

會解決這個問題。另外,不要更改傳遞一個指針的指針:

doThat(&x); 

要:

doThat(x); /* <= Note: Don't take the address of x here! */ 
+0

那麼鑄造就不要求了嗎? \t'struct DirectMap * x1 = x;' 這個調用可以工作,但不是在打印'x1-> var1'時打印一個地址,而是打印0.但是,打印'x-> var1'打印出正確的價值在我們doThis功能和主要。 – user1553248

+1

@ user1553248 - 我用示例修復更新了我的答案。 – Bill

+0

非常感謝!這個改變解決了我們的問題 – user1553248