2015-02-07 167 views
0

我是C中的一個新手。我試圖在main之外創建一個typedef結構,然後創建一個指針typedef。然後將此指針傳遞給另一個函數。但是,我收到錯誤。這是推動我瘋了。謝謝非常提前多..使用指針訪問結構成員

typedef struct rem_info 
{ 
    char   ufrag[80]; 
    char   pwd[80]; 
    unsigned  comp_cnt; 
    pj_sockaddr def_addr[PJ_ICE_MAX_COMP]; 
    unsigned  cand_cnt; 
    pj_ice_sess_cand cand[PJ_ICE_ST_MAX_CAND]; 
} rem_info; 

void reset_rem_info(rem_info *prem) 
{ 
    pj_bzero(prem, sizeof(rem_info)); 
} 

int main() 
{ 
    rem_info *prem; 
    reset_rem_info(&prem); 

    return 0; 
} 

錯誤:

*WARNING**:ex7.c:51:1: warning: passing argument 1 of ‘reset_rem_info’ from incompatible pointer type [enabled by default] 
reset_rem_info(&prem); 
^ 
ex7.c:41:6: note: expected ‘struct rem_info *’ but argument is of type ‘struct rem_info **’ 
    void reset_rem_info(rem_info *prem) 
+2

嘗試更改'reset_rem_info(&prem);'''reset_rem_info(prem);'您不需要取消引用指針 – jpw 2015-02-07 17:07:56

+0

此標題「*使用指針訪問結構成員*」是誤導性的,因爲問題是**不**關於訪問結構的**成員**,但關於訪問**整個**結構 – alk 2015-02-07 17:16:56

+0

我同意...實際上,需要在一個點上的代碼來訪問結構成員。但是在達到那個點之前我被卡住了。但是非常感謝您的回覆 – bislinux 2015-02-07 17:41:08

回答

1
void reset_rem_info(rem_info *prem) 

這裏函數參數類型預期的rem_info指針和你所傳遞的是指針的地址,所以有一個類型不匹配,因此警告。

你可以有

void reset_rem_info(rem_info **prem) 

確保您初始化指針,並通過指針prem的地址指針在函數參數指針。像圖所示

int main() 
{ 
    rem_info *prem = malloc(sizeof(rem_info)); 
    reset_rem_info(&rem_info); 
} 

或同時調用函數有

int main() 
{ 
    rem_info prem; 
    reset_rem_info(&prem); 
} 

使您的函數原型保持不變。

+0

雖然這起作用,它會改變函數提供的接口。我懷疑這是OP所需要的。此外,該函數的當前代碼將失敗。 – alk 2015-02-07 17:09:49

+0

@alk OP想要擺脫警告API內部做了什麼是OP必須處理的事情。 – Gopi 2015-02-07 17:11:26

+0

這種方法在我看來就像打架symphtoms ...排序巫術編程... sry。 – alk 2015-02-07 17:14:15

-2
void reset_rem_info(rem_info **prem) 
{ 
pj_bzero(*prem, sizeof(rem_info)); 
} 

int main() 
{ 
rem_info *prem; 
reset_rem_info(&prem); 

return 0; 
} 

,如果你想的malloc炳在您忘記reset_rem_info爲無效reset_rem_info(rem_info *炳)A *,然後取消對它的引用了bzero 別的唐噸編寫&在reset_rem_info(&prem);

+1

從什麼結論:「*到'reset_rem_info()'*」中的malloc預處理? – alk 2015-02-07 17:11:53

+0

在你的代碼中,rem_info *現在是malloc,所以當你使用它時它會出現段錯誤。所以你需要malloc它。當你用C發送一個變量時,它會創建一個副本,所以如果你想將malloc rem_info複製到reset_rem_info中,你需要發送它的地址,如果你使用地址副本malloc,你會在函數結束時丟失它。因此,要將它置於reset_rem_info中,您必須發送地址併發送rem_info ** prem並創建* prem = malloc(sizeof(prem)); – 2015-02-07 17:21:02

3

你的主要功能展望:

int main() 
{ 
    rem_info *prem; 
    reset_rem_info(&prem); 

    return 0; 
} 

您正在創建一個指向rem_info的指針並將其地址傳遞給reset_rem_info。這意味着你正在傳遞一個指向rem_info的指針。爲了進行類型檢查,你可以直接傳遞指針,而不用考慮它的地址。

int main() 
{ 
    rem_info *prem; 
    reset_rem_info(prem); 

    return 0; 
} 

但是,這可能會給你一個錯誤。您現在正在處理一個未初始化的指向rem_info的指針。你可能想要的是創建一個實際的rem_info並將其地址(一個指向rem_info的指針)傳遞給該函數。

int main() 
{ 
    rem_info prem; 
    reset_rem_info(&prem); 

    return 0; 
} 
0

感謝球員的快速回復..加布裏埃爾的迴應給了我一個很好的見解。然而我堅持拉斐爾桑托斯的迴應。 ......但是,如果加布裏埃爾可能好心闡述點多一點,請...確定這裏是固定的代碼

typedef struct rem_info 
    { 
    char   ufrag[80]; 
    char   pwd[80]; 
    unsigned  comp_cnt; 
    pj_sockaddr def_addr[PJ_ICE_MAX_COMP]; 
    unsigned  cand_cnt; 
    pj_ice_sess_cand cand[PJ_ICE_ST_MAX_CAND]; 
    }rem_info; 

void reset_rem_info(rem_info *prem) 
{ 
    pj_bzero(prem, sizeof(rem_info)); 
} 

int main() 
{ 

rem_info prem; 
reset_rem_info(&prem); 

return 0; 
} 

的變化擺脫了警告,並分割轉儲...

感謝一位全傢伙