2015-02-07 126 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; 
} 

的变化摆脱了警告,并分割转储...

感谢一位全家伙